5.5.2 拉普拉斯掩模锐化(1)
1.基本理论
拉普拉斯算子是最简单的各向同性微分算子,具有旋转不变性。一个二维图像函数 的拉普拉斯变换是各向同性的二阶导数,定义为:
|
(5-11) |
为了更适合于数字图像处理,将该方程表示为离散形式:
|
(5-12) |
另外,拉普拉斯算子还可以表示成模板的形式,如图5-9所示。图5-9(a)表示离散拉普拉斯算子的模板,图5-9(b)表示其扩展模板,图5-9(c)则分别表示其他两种拉普拉斯的实现模板。从模板形式容易看出,如果在图像中一个较暗的区域中出现了一个亮点,那么用拉普拉斯运算就会使这个亮点变得更亮。因为图像中的边缘就是那些灰度发生跳变的区域,所以拉普拉斯锐化模板在边缘检测中很有用。一般增强技术对于陡峭的边缘和缓慢变化的边缘很难确定其边缘线的位置。但此算子却可用二次微分正峰和负峰之间的过零点来确定,对孤立点或端点更为敏感,因此特别适用于以突出图像中的孤立点、孤立线或线端点为目的的场合。同梯度算子一样,拉普拉斯算子也会增强图像中的噪声,有时用拉普拉斯算子进行边缘检测时,可将图像先进行平滑处理。
|
图5-9 拉普拉斯的4种模板 |
图像锐化处理的作用是使灰度反差增强,从而使模糊图像变得更加清晰。图像模糊的实质就是图像受到平均运算或积分运算,因此可以对图像进行逆运算,如微分运算能够突出图像细节,使图像变得更为清晰。由于拉普拉斯是一种微分算子,它的应用可增强图像中灰度突变的区域,减弱灰度的缓慢变化区域。因此,锐化处理可选择拉普拉斯算子对原图像进行处理,产生描述灰度突变的图像,再将拉普拉斯图像与原始图像叠加而产生锐化图像。拉普拉斯锐化的基本方法可以由下式表示:
这种简单的锐化方法既可以产生拉普拉斯锐化处理的效果,同时又能保留背景信息,将原始图像叠加到拉普拉斯变换的处理结果中去,可以使图像中的各灰度值得到保留,使灰度突变处的对比度得到增强,最终结果是在保留图像背景的前提下,突现出图像中小的细节信息。
2.算法实现
CImgEnhance类中的成员函数LapTemplate()实现拉普拉斯锐化操作,在对灰度图像进行梯度锐化时直接调用LapTemplate()函数即可。以下是LapTemplate()函数的代码实现。
/************************************** ******************************** * * 函数名称: * LapTemplate(int inputH, int inputW, int inputX0, int inputY0, float * pTemplate, float fCoef) * * 参数: * int inputH-模板的高度 * int inputW-模板的宽度 * int inputX0-模板的中心元素X坐标 * int inputY0-模板的中心元素Y坐标 * float *pTemplate-指向模板数组的指针 * float f-模板系数 * * 返回值: * void * * 说明: * 该函数用指定的模板(任意大小)来对 图像进行操作,参数inputH指定模板 * 的高度,参数inputW指定模板的宽度, 参数inputX0和iinputY0指定模板的中心 * 元素坐标,参数pTemplate指定模板元素,f指定系数 * 拉普拉斯锐化 *********************************** ***********************************/ void CImgEnhance::LapTemplate(int inputH, int inputW, int inputX0, int inputY0, float *pTemplate, float f) { unsigned char *pSrc, *pDst; int i,j,k,l; float value;
if(m_pImgDataOut != NULL) { delete []m_pImgDataOut; m_pImgDataOut = NULL; } int lineByte = (m_imgWidth * m_nBitCount / 8 + 3) / 4 * 4;
if(m_nBitCount != 8) { AfxMessageBox("只能处理8位灰度图像!"); return ; } //创建要复制的图像区域 m_nBitCountOut = m_nBitCount; int lineByteOut = (m_imgWidth * m_nBitCountOut / 8 + 3) / 4 * 4; if (!m_pImgDataOut) { m_pImgDataOut = new unsigned char [lineByteOut * m_imgHeight]; }
int pixelByte = m_nBitCountOut / 8; for(i = 0; i < m_imgHeight; i++){ for(j = 0; j < m_imgWidth * pixelByte; j++) *(m_pImgDataOut + i * lineByteOut + j) = *(m_pImgData + i * lineByteOut + j); }
//行处理 for (i = inputY0; i < m_imgHeight - inputH + inputY0 + 1; i++) { //列处理 for (j = inputX0; j inputW + inputX0 + 1; j++) { //指向新DIB第i行第j列像素的指针 pDst = m_pImgDataOut + lineByte * (m_imgHeight -1 - i) + j;
value=0; //计算 for (k = 0; k < inputH; k++) { for (l = 0; l < inputW; l++) { pSrc = m_pImgData + lineByte * (m_imgHeight - 1 - i + inputY0 - k)+ j - inputX0 + l; //计算加权平均 value += (*pSrc) * pTemplate[k * inputW + l]; } } //乘以系数 value *= f; //取结果的绝对值 value = (float)fabs(value); if (value > 255) { *pDst = 255; } else { *pDst = (unsigned char)(value+0.5); } } } } |
【责任编辑:
夏书 TEL:(010)68476606】