图像增强之空间域锐化

微笑、不失礼 提交于 2020-02-08 00:28:16

1、图像锐化理论

图像锐化的目的是使图像变得清晰起来,锐化主要用于增强图像的灰度跳变部分,这一点与图像平滑对灰度跳变的抑制正好相反。锐化提高图像的高频分量,增加灰度反差增强图像的边缘和轮廓,以便后期图像识别。

在图像增强过程中,常用平滑算法来消除噪声,平滑属于低通滤波,图像的能量主要集中在低频部分,噪声所在频段主要在高频部分,同时图像的边缘也集中在高频部分,这意味着图像平滑后,高频被衰减轮廓会出现模糊。图像锐化就是为了减少这种现象,通过高通滤波使图像边缘和轮廓变得清晰。

2、一阶微分图像增强--梯度算子

其中:

梯度的方向就是函数f(x,y)最大变化率的方向。梯度的幅值作为最大变化率大小的度量,值为:  

离散的二维函数f(i,j),可以用有限差分作为梯度的一个近似值。

为了简化计算,可以用绝对值来近似。

|f(i,j)|= |f(i+1,j)-f(i,j)| +|f(i,j+1)-f(i,j)|

2.1 Robert算子

   |f(i,j)|= |f(i+1,j+1)-f(i,j)| +|f(i,j+1)-f(i+1,j)|

上面算式采用对角相差的差分法来代替微分,写为滤波模板形式为:

其中w1对接近45°的边缘有较强响应,w2对接近-45°的边缘有较强响应。

imgPath = 'E:\opencv_pic\src_pic\pic6.bmp';
img = imread(imgPath);
img=rgb2gray(img);
w1 =[-1,0; 0,1];
w2 =[0,-1; 1, 0];
 
G1=imfilter(img, w1, 'corr', 'replicate');
G2=imfilter(img, w2, 'corr', 'replicate');
G=abs(G1)+abs(G2);
subplot(2,2,1),imshow(img), title('原始图像');
subplot(2,2,2),imshow(abs(G1)), title('w1图像');
subplot(2,2,3),imshow(abs(G2)),title('w2滤波');
subplot(2,2,4),imshow(G),title('Robert交叉梯度图像');

可见w1滤波后45°的边缘被突出,w2滤波后-45°的边缘被突出。Robert交叉滤波后全部边缘突出显示。

2.2 Sobel算子

滤波时一般更多使用奇数尺寸的模板,下面是Sobel算子。

imgPath = 'E:\opencv_pic\src_pic\pic6.bmp';
img = imread(imgPath);
img=rgb2gray(img);
 
 
w1 =[-1,-2,-1; 0,0,0;  1,2, 1];
w2 =[ -1,0,1;  -2,0,2; -1,0,1];
G1=imfilter(img, w1);
G2=imfilter(img, w2);
G=abs(G1)+abs(G2);
subplot(2,2,1),imshow(img), title('原始图像');
subplot(2,2,2),imshow(abs(G1)), title('w1图像');
subplot(2,2,3),imshow(abs(G2)),title('w2滤波');
subplot(2,2,4),imshow(G),title('Sobel交叉梯度图像');

Robert算子,w1滤波后45°的边缘被突出,w2滤波后-45°的边缘被突出。Sobel交叉滤波后全部边缘突出显示。

3、二阶微分滤波--拉普拉斯算子

二维函数f(x,y)在二阶微分(拉普拉斯算子)的定义为:

 

将上式相加后就得到拉普拉斯算子:

对应的滤波模板如下:

考虑到求绝对值计算梯度,正负系数图形的响应一样,上面的模板也可以表示为:

上面的模板具有对称性,所以求一次滤波就可以,不需要像一阶微分那样计算2次。

imgPath = 'E:\opencv_pic\src_pic\pic6.bmp';
img = imread(imgPath);
img=rgb2gray(img);
 
w1 =[0,1,0;  1,-4,1;   0,1,0];
w2 =[0,-1,0; -1,4,-1;  0,-1,0];
w3 =[1,4,1; 4,-20,4;  1,4,1];
G1=imfilter(img, w1, 'corr', 'replicate');
G2=imfilter(img, w2, 'corr', 'replicate');
G3=imfilter(img, w3, 'corr', 'replicate');

subplot(2,2,1),imshow(img,[]), title('原始图像');
subplot(2,2,2),imshow(abs(G1)), title('w1图像');
subplot(2,2,3),imshow(abs(G2)),title('w2滤波');
subplot(2,2,4),imshow(abs(G3)),title('加权二阶滤波');

二阶滤波比之前的一阶滤波锐化程度更加强烈,留下了非常清晰的边缘图案。w1w2滤波的方向性不明显图像基本一致,仅w2滤波图像的轮廓更加深一些。

使用imsharpen对图像进行锐化,对锐化强度参数进行控制,可见太高的锐化强度导致图像出现“纹理”,效果变差。

b1=imsharpen(img,'Radius',1,'Amount',0.2);
b2=imsharpen(img,'Radius',1,'Amount',2);
b3=imsharpen(img,'Radius',1,'Amount',1);
subplot(1,4,1),imshow(img), title('原始图像');
subplot(1,4,2),imshow(b1), title('imsharpen图像1');
subplot(1,4,3),imshow(b2), title('imsharpen图像2');
subplot(1,4,4),imshow(b3), title('imsharpen图像3');

4、锐化图像后续处理

无论一阶微分算子还是二阶微分算子,各系数之和都为0,说明算子在灰度恒定区域的响应为0,即锐化后的图像,在原图比较平坦的区域几乎都变为黑色,而在图像边缘,灰度跳变点的细节被突出显示。一般图像锐化是希望增强图像的边缘和细节,而非将平滑区域的灰度信息丢失。因此,可以用原图像加上锐化后的图像,得到比较理想的结果。

使用Sobel算子锐化和matlab内置锐化函数锐化之后的图像对比,下图是内置函数锐化结果:

b=imsharpen(img,'Radius',2,'Amount',1);
subplot(1,2,1),imshow(img), title('原始图像');
subplot(1,2,2),imshow(b), title('imsharpen图像');

imsharpen滤波图像明显比算子锐化的图像亮度更高,保留了原图比较平坦的部分,比如背景图部分。如果希望上面的滤波函数也达到这个效果,只需要把原图加上滤波后的图像即可,系数是为了防止溢出,比如下面的例子。使用函数为imshow(G+0.7*img),title('Sobel交叉梯度图像')。

5、参考文献

1MATLAB--数字图像处理 图像锐化(原理篇)

https://www.csdn.net/gather_24/MtjaMg4sMjg1OS1ibG9n.html

2imsharpen

https://ww2.mathworks.cn/help/images/ref/imsharpen.html

3、《数字图像处理与机器视觉》

第二版。 张铮、徐超、任淑霞、韩海玲等编著。

 

 尊重原创技术文章,转载请注明。

https://www.cnblogs.com/pingwen/p/12275235.html

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!