设为首页 加入收藏

TOP

5.5.1 梯度锐化(2)
2013-10-07 00:22:38 】 浏览:275
Tags:5.5.1 梯度

5.5.1  梯度锐化(2)

2.算法实现

CImgEnhance类中的成员函数GradSharp()实现梯度锐化操作,本算法程序是根据门限判断的梯度锐化方法编写的,阈值设为20,如果梯度加100大于255,则将其置为255。在对灰度图像进行梯度锐化时直接调用GradSharp()函数即可,以下是GradSharp()函数的代码实现。

/**********************************
***************************************
* 函数名称:
*     GradSharp()
* 参数:
*     BYTE  threshold-阈值
* 返回值:
*     BOOL - 成功返回TRUE,否则返回FALSE
* 说明:该函数用来对图像进行梯度锐化
*    
/************************************
************************************/
void CImgEnhance::GradSharp(unsigned char threshold)
{
 unsigned char *pSrc, *pDst, *pSrc1, *pSrc2;
LONG i,j;    //循环变量
int  bTemp;
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 = 0; i < m_imgHeight; i++)  //每行
{  
for(j = 0; j < m_imgWidth; j++)  //每列
{
//指向新DIB第i行第j列像素的指针
pDst = m_pImgDataOut + lineByte *
(m_imgHeight -1 - i) + j;

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

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

3.函数调用

在视图类CDemoView中映射“梯度锐化”事件的处理函数OnGradesharp()。以下是CDemoView:: OnGradesharp()函数的代码实现。

 void CDemoView::OnGradesharp() 
{
CDemoDoc *pDoc=GetDocument();
ImgCenterDib *pDib=pDoc->GetPDib();

if(pDib->m_nBitCount!=8&{
::MessageBox(0,"只处理灰度图像",MB_OK,0);
return ;
}

CImgEnhance imgnoise(pDib->GetDimensions(),
pDib->m_nBitCount,
pDib->m_lpColorTable, pDib->m_pImgData);

unsigned char bThre=30;
imgnoise.GradSharp(bThre);

CMainFrame* pFrame = (CMainFrame *)(AfxGetApp()->m_pMainWnd);
pFrame->SendMessage(WM_COMMAND, ID_FILE_NEW);

CDemoView* pView=(CDemoView*)pFrame->MDIGetActive()->GetActiveView();
CDemoDoc* pDocNew=pView->GetDocument();
ImgCenterDib *dibNew=pDocNew->GetPDib();

dibNew->ReplaceDib(imgnoise.GetDimensions(),imgnoise.m_nBitCountOut,imgnoise.m_lpColorTable, imgnoise.m_pImgDataOut);
pDocNew->SetModifiedFlag(TRUE);
pDocNew->UpdateAllViews(pView);

Invalidate(); 
}

4.实验结果与分析

图5-8(a)显示了一幅花朵的图片,图5-8(b)显示了用门限判断梯度锐化方法对该图像滤波后的结果。由图可以看出,经过锐化处理后的图像既增强了目标的边界,也保留了图像背景原来的状态。

 
(点击查看大图)图5-8  梯度锐化方法的增强结果
【责任编辑:夏书 TEL:(010)68476606】

回书目   上一节   下一节

】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇5.5.2 拉普拉斯掩模锐化(1) 下一篇5.5.1 梯度锐化(1)

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目