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】
|