您的位置:首页 > 其它

图像增强-图像锐化

2012-07-21 20:20 190 查看
图像锐化主要影响图像中的低频分量,不影响图像中的高频分量。

图像锐化的主要目的有两个:

1.增强图像边缘,使模糊的图像变得更加清晰,颜色变得鲜明突出,图像的质量有所改善,产生更适合人眼观察和识别的图像;

2.希望通过锐化处理后,目标物体的边缘鲜明,以便于提取目标的边缘、对图像进行分割、目标区域识别、区域形状提取等,进一步的图像理解与分析奠定基础。

图像锐化一般有两种方法:

1.微分法

2.高通滤波法

这里主要介绍一下两种常用的微分锐化方法:梯度锐化和拉普拉斯锐化。

注意:由于锐化使噪声受到比信号还要强的增强,所以要求锐化处理的图像有较高的信噪比;否则,锐化后的图像的信噪比更低。

1.梯度锐化

基本理论

邻域平均法或加权平均法可以平滑图像,反过来利用对应的微分算法可以锐化图像。微分算法是求信号的变化率,有加强高频分量胡作用,从而使图像轮廓清晰。

由于图像模糊胡实质是图像受到平均或积分运算造成的,所以为了把图像中任何方向伸展的边缘肯模糊的轮廓变得清晰,可以对图像进行逆运算如微分运算,从而使图像清晰化。

在图像处理中,一阶微分是通过梯度算法来实现的,对于一幅图像用函数f(x,y)表示,定义在f(x,y)在点(x,y)处的梯度是一个矢量,定义为:

View Code

/*************************************************************************
* 函数名称:
*   GradSharp()
* 参数:
*   BYTE  bThre        - 阈值
* 返回值:
*   BOOL            - 成功返回TRUE,否则返回FALSE。
* 说明:
*   该函数用来对图像进行梯度锐化,设定梯度锐化的阈值为30
/************************************************************************/
void CImgEnhance::GradSharp(unsigned char Thre)
{
unsigned char*    pSrc;       // 指向源图像的指针
unsigned char*    pDst;
unsigned char*    pSrc1;
unsigned char*    pSrc2;
LONG    i,j;                // 循环变量
int    bTemp;
if(m_pImgDataOut != NULL)
{
delete []m_pImgDataOut;
m_pImgDataOut = NULL;
}

if(m_nBitCount != 8)
{
AfxMessageBox("只能处理8位灰度图像!");
return ;
}
int lineByte = (m_imgWidth * m_nBitCount / 8 + 3) / 4 * 4;

//创建要复制的图像区域
m_nBitCountOut = m_nBitCount;
int lineByteOut = lineByte;
if (!m_pImgDataOut)
{
m_pImgDataOut = new unsigned char[lineByteOut * m_imgHeight];
}

int pixelByte = m_nBitCountOut / 8; // 此处实际就是1,因为只处理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 = 0; i < m_imgHeight; i++)        // 每行
{
for(j = 0; j < m_imgWidth; j++)        // 每列
{
//指向新DIB第i行第j列的像素的指针
pDst = m_pImgDataOut + lineByte * i + j;

// 进行梯度运算
// 指向DIB第i行,第j个象素的指针
pSrc  = (unsigned char*)m_pImgData + lineByte * i + j;
// 指向DIB第i+1行,第j个象素的指针
pSrc1 = (unsigned char*)m_pImgData + lineByte * (i+1) + j;
// 指向DIB第i行,第j+1个象素的指针
pSrc2 = (unsigned char*)m_pImgData + lineByte * i + j + 1;
bTemp = abs((*pSrc)-(*pSrc1)) + abs((*pSrc)-(*pSrc2));

// 判断是否小于阈值
if ((bTemp+120) < 255)
{
// 判断是否大于阈值,对于小于情况,灰度值不变。
if (bTemp >= Thre)
{
*pSrc = bTemp + 120;
}
}
else
{
*pSrc = 255;
}
//生成新的DIB像素值
*pDst = *pSrc;
}
}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: