|
图像锐化的目的是使模糊图像变清晰,方法可以大致分为两类:微分法、高频加重滤波法。其中微分法可以分为梯度法、Sobel算子法、Laplace算子法。
在做图像锐化时要注意,处理的图像必须有较高的信噪比,否则锐化会使噪声收到比信号还强的增强,一般先降噪后锐化。
微分法
微分运算是求信号的变化率,加强高频分量,使图像轮廓清晰。希望通过导数运算使边缘和轮廓变清晰,这就要求该导数运算是各向同性的(旋转不变性),可以证明偏导数的平方和运算具有此性质。
对于图像 ,在点 处的梯度是一个矢量,定义为 。
梯度的幅度表示为
对于数字图像而言, ,
该式可以简化成
各个像素的位置
图像的最后一行(列)的梯度无法求得,一般用前一行(列)的梯度代替。
当梯度计算完之后,可以根据需要生成不同的梯度增强图像,
1)第一种, ,只显示灰度变化大的边缘轮廓,灰度变化平缓的呈黑色。
2)第二种,
可以显示出非常明显的边缘轮廓,又不会破坏原灰度变化平缓的背景。
3)第三种,
边缘轮廓用固定的灰度级 表示。
4)第四种,
背景用固定灰度级 表示,便于研究边缘灰度的变化。
5)第五种,
将背景和边缘用二值图像表示,便于研究边缘所在位置。
2. Sobel算子
采用梯度微分锐化图像,会让噪声、条纹得到增强,Sobel算子在一定程度上解决了这个问题,
从这个式子中,可以得到两个性质,
- Sobel引入了平均的因素,因此对噪声有一定的平滑作用
- Sobel算子的操作就是相隔两个行(列)的差分,所以边缘两侧元素的得到了增强,因此边缘显得粗而亮。
Sobel算子表示形式为:
3. 拉普拉斯算子(二阶微分)
拉普拉斯运算也是各向同性的线性运算。拉普拉斯算子为: ,锐化之后的图像 
为扩散效应的系数。
由此式可知,数字图像在 点的拉普拉斯算子,可以由该点的灰度值减去该点及其邻域四个点的平均灰度值求得。
拉普拉斯算子的模板图可表示为:
还有其他的常用拉普拉斯模板:
高通滤波
高通滤波法采用高通滤波器让高频分量通过,使图像的边缘和线条变得清楚,实现锐化。
高通滤波器而用空域法和频域法实现,在空间域使用卷积方法,模板如
可以看出和拉普拉斯算子基本相同。
个人理解:为了能够让高频通过, 点与其四个邻域点应该满足可以过零的性质,因为导数跨零,原函数曲线不会是单调的,必然会在零点处改变单调性,产生高频效果。
代码
Sobel算子
import cv2
import matplotlib.pyplot as plt
plt.subplot(1, 2, 1)
img = cv2.imread("image.jpg", 0) # 0为灰度图
plt.imshow(img)
plt.subplot(1, 2, 2)
depth = cv2.CV_16S
#求X方向梯度(创建grad_x, grad_y矩阵)
grad_x = cv2.Sobel( img, depth, 1, 0 )
abs_grad_x = cv2.convertScaleAbs( grad_x )
#求Y方向梯度
grad_y = cv2.Sobel( img, depth, 0, 1 )
abs_grad_y = cv2.convertScaleAbs( grad_y )
#合并梯度
sobel_img = cv2.addWeighted( abs_grad_x, 0.5, abs_grad_y, 0.5, 0 )
plt.imshow(sobel_img)
plt.show()
灰度图 以及 Sobel算子
Laplace算子
import cv2
import matplotlib.pyplot as plt
plt.subplot(1, 2, 1)
img = cv2.imread("image.jpg", 0) # 0为灰度图
plt.imshow(img)
plt.subplot(1, 2, 2)
depth = cv2.CV_16S
kernel_size = (3, 3) # 模板大小
scale = 1 # 扩散系数
laplace_img = cv2.Laplacian(img, depth, kernel_size, scale=scale)
plt.imshow(laplace_img)
plt.show()
灰度图 以及 Laplace算子 |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
×
|