X. 锐化空间滤波器
锐化处理的主要目的是突出图像中的细节或者增强被模糊了的细节,这种模糊不是由于错误操作,就是特殊图像获取方法的固有印象。总的来说,微分算子的响应强度与图像在该店(应用了算子)的突变程度有关。这样一来,图像微分增强了边缘和其他突变(如噪声)并削弱了灰度变化缓慢的区域。
为了说明简单,主要集中讨论一阶微分的性质。我们最高兴去的微分性质是恒定灰度区域(平坦段)、突变的开头与结尾(阶梯和斜坡突变)及沿着灰度级斜坡处的特性。这些类型的突变可以用来对图像中的噪声点、细线与边缘模型化。
这里我们首先了解下数学函数的微分,微分可以用不同的术语定义,也有各种方法定义这些差别,然而,对于一阶微分任何定义都必须保证以下几点:(1)在平坦段(灰度不变区域)微分值为零;(2)在灰度阶梯或斜坡的起始点处微分值非零;(3)沿着斜坡面微分值非零。任何二阶微分的定义也类似:(1)在平坦去微分值必为零;(2)在灰度阶梯或斜坡的起始点处微分值非零;(3)沿着斜坡面微分值非零。
因为我们处理的是数字量,其值是有限的,故最大灰度级的变换也是有限的,变化发生最短距离是在两相邻像素之间。对于一元函数f(x)表达一阶微分定义是一个差值:
这里,为了与对二元图像函数f(x,y)求微分时的表达式保持一致,使用偏导数符号,对二元函数,我们将沿着两个空间轴处理偏微分,类似地,用差分定义二阶微分:
XX. 基于二阶微分的图像增强--拉普拉斯算子
这里介绍二阶微分在图像增强处理中的应用。首先定义一个二阶微分的离散公式,然后构造一个基于此式的滤波器。我们最关注的是一种各向同性滤波器,这种滤波器的响应与滤波器作用的图像的突变方向无关。也就是说,各向同性滤波器是旋转不变的,即将原始图像旋转后进行滤波处理给出的结果与先对图像滤波,然后再旋转的结果相同。
处理方法
最简单的各向同性微分算子是拉普拉斯算子,一个二元图像函数f(x,y)的拉普拉斯变换定义为:
因为任意阶微分都是线型操作,所以拉普拉斯变换也是一个线性操作。
考虑到有两个变量,因此,我们在x,y方向上对二阶偏微分采用下俩定义:
因此二维拉维拉斯数字实现可由这两个分量相加得到:
,这里关注系数矩阵即掩膜:
这个矩阵给出了在90度方向上旋转的各向同性结果,如果向得到45度方向上旋转的各向同性结果则,将中心对角点标为1,中心点为-8即可。
由于拉普拉斯是一种微分算子,它的应用强调图像中灰度的突变及降低灰度慢变化的区域。将原始图像和拉普拉斯图像叠加在一起的简单方法可以保护拉普拉斯锐化处理的效果,同时又能复原背景信息。我们使用拉普拉斯变换对图像增强的基本方法可表示为下式:
在Opencv上做了下试验,分别是原图,laplace变换后图,和做差图。很明显经过拉普拉斯变换后图像锐化,同时尽可能保留了其灰度色调。而经过做差后的图像细节更加清晰(感觉有点小问题,希望大家指正,应该是颜色空间搞错了,不过细节确实更加清晰了)
#include "dipHeader.h"
void enhanceImage(IplImage* srcImg,IplImage* dstImg)
{
if (srcImg->nChannels==3)
{
IplImage* lapbur=cvCreateImage(cvGetSize(srcImg),IPL_DEPTH_16S,1);
IplImage* lapbur8U=cvCreateImage(cvGetSize(srcImg),IPL_DEPTH_8U,1);
IplImage* temp[3];
IplImage* tempsrc;
tempsrc = cvCreateImage(cvGetSize(srcImg),IPL_DEPTH_8U,1);
for (int j=0;j<3;j++)
{
temp[j] = cvCreateImage(cvGetSize(srcImg),8,1);
}
cvSplit(srcImg,temp[0],temp[1],temp[2],0);
for (int i=0;i<3;i++)
{
cvSmooth(temp[i],tempsrc,CV_GAUSSIAN);
cvLaplace(tempsrc,lapbur,1);
cvConvertScale(lapbur,lapbur8U);
cvSub(temp[i],lapbur8U,temp[i]);
}
cvMerge(temp[0],temp[1],temp[2],0,dstImg);
}
if (srcImg->nChannels==1)
{
IplImage* lapbur=cvCreateImage(cvGetSize(srcImg),IPL_DEPTH_16S,1);
IplImage* tempsrc;
tempsrc = cvCreateImage(cvGetSize(srcImg),IPL_DEPTH_8U,1);
cvSmooth(srcImg,tempsrc,CV_GAUSSIAN);
cvLaplace(tempsrc,lapbur,1);
cvConvertScale(lapbur,tempsrc);
cvSub(srcImg,tempsrc,dstImg);
}
}
void main()
{
IplImage* src = cvLoadImage("moon.tif");
cvNamedWindow("src",0);
cvShowImage("src",src);
#if 1//1.图像增强laplace
IplImage* enImg = cvCreateImage(cvGetSize(src),8,src->nChannels);
enhanceImage(src,enImg);
cvNamedWindow("enImg",0);
cvShowImage("enImg",enImg);
cvWaitKey(0);
#endif
#if 1 //灰度
IplImage* gray = cvCreateImage(cvGetSize(src),8,1);
IplImage* graydst = cvCreateImage(cvGetSize(src),8,1);
cvCvtColor(src,gray,CV_BGR2GRAY);
enhanceImage(gray,graydst);
cvNamedWindow("gray",0);
cvShowImage("gray",gray);
cvNamedWindow("graydst",0);
cvShowImage("graydst",graydst);
cvWaitKey(0);
#endif
}