五、 图像锐化
图像锐化与图像去噪的操作相反,是为了凸显图像一些轮廓和边缘,从而更好的对图像中的目标进行分割和识别,同样这样的操作也会增强噪声,故需要抑制一些噪声的方法。图像锐化的空域方法是利用微分实现的,常见的有一阶微分和二阶微分。因为图像边界信息往往是位于高频部分,利用频域的低通滤波来得到图像的高频信息也可以提取到边界信息。
1、 一阶微分法
图像的微分是利用梯度来实现的,而数字图像的微分运算一般使用差分来代替。
Roberts算子
水平和垂直方向的模板如下图:
将水平和垂直模板分别与图像卷积,最后计算的梯度可以表示为它们的平方平均或近似为它们的绝对值之和,如下式所示:
g(x,y)=|f(x,y)-f(x-1,y-1)|+|f(x-1,y)-f(x,y-1)|
Prewitt算子
考虑到目标像素周围的点,先求平均,再进行差分,水平和垂直方向的模板如下图:
Sobel算子
考虑到对距离的加权平均,一定程度的抑制噪声,水平和垂直方向的模板如下图:
其他模板如各向同性sobel算子、方向梯度模板等不再赘述可自行百度。
Opencv函数
CVAPI(void) cvSobel( const CvArr* src, CvArr* dst,
int xorder, int yorder,
int aperture_size CV_DEFAULT(3));
参数一:源图像
参数二:输出图像
参数三:x 方向上的差分阶数
参数四:y 方向上的差分阶数
参数五:核的大小,必须是1、3、5、7 。等于1时使用 3x1 或 1x3 内核。特殊变量 CV_SCHARR (=-1),对应 3x3 Scharr 滤波器, Scharr 滤波器系数是:
注1:sobel算子卷积出的结果会存在负号,因此源图像为8位无符号,输出图像应该保存为16位有符号数,然后再进行转换。代码如下:
IplImage *src, *dst;
src = cvCreateImage(cvGetSize(m_ipl), IPL_DEPTH_8U, 1);
cvCvtColor(m_ipl, src, CV_RGB2GRAY);
dst = cvCreateImage(cvGetSize(src), IPL_DEPTH_8U, 1