图像增强-3
图像的平滑用来减弱或消除图像中的高频分量,但不影响低频分量。因为高频分量主要对应图像中的区域边缘等灰度值具有较大较快变化的部分,平滑滤波将这些分量滤去可减少局部灰度起伏,使图像变得比较平滑。实际应用中,平滑滤波还可用于消除噪声,或者在提取较大目标前取出过小的细节或将目标内的小间断连接起来。它的主要目的是消除图像采集过程中的图像噪声,在空间域中主要利用邻域平均法、中值滤波法和选择式掩膜平滑法来减少噪声。
1、邻域平均法
邻域平均法是将原图中一个像素的灰度值和它周围邻域n个像素的灰度值相加,然后将求的的平均值作为新图中该像素的灰度值。邻域平均法采用了模板计算的思想,模板操作实现了一种邻域运算,在数学中的描述就是卷积运算。
邻域平均法的模板为:
中间带*号的表示以该像素为中心元素,即该像素是要进行处理的像素。在实际应用中,也可以根据不同的需要选择使用不同的模板尺寸。常用的模板尺寸如:3X3, 5X5,7X7,9X9等。
算法实现:
View Code
1 /********************************************************************** 2 * 参数: 3 * int TempH 模板的高度 4 * int TempW 模板的宽度 5 * int TempCX 模板的中心元素X坐标 ( < iTempW - 1) 6 * int TempCY 模板的中心元素Y坐标 ( < iTempH - 1) 7 * float *fpTempArray 指向模板数组的指针 8 * float f 模板系数 9 * 10 **********************************************************************/ 11 void CImgEnhance::AvgTemplate(int TempH, int TempW, int TempCX, int TempCY, float *fpTempArray, float f) 12 { 13 unsigned char* pSrc; 14 unsigned char* pDst; 15 int i,j,k,l; 16 float value; 17 if(m_pImgDataOut != NULL) 18 { 19 delete []m_pImgDataOut; 20 m_pImgDataOut = NULL; 21 } 22 int lineByte = (m_imgWidth * m_nBitCount / 8 + 3) / 4 * 4; 23 24 if(m_nBitCount != 8) 25 { 26 AfxMessageBox("只能处理8位灰度图像!"); 27 return ; 28 } 29 //创建要复制的图像区域 30 m_nBitCountOut = m_nBitCount; 31 int lineByteOut = (m_imgWidth*m_nBitCountOut / 8 + 3) / 4 * 4; 32 if (!m_pImgDataOut) 33 { 34 m_pImgDataOut = new unsigned char[lineByteOut*m_imgHeight]; 35 } 36 37 int pixelByte = m_nBitCountOut / 8; 38 for(i = 0; i < m_imgHeight; i++) 39 { 40 for(j = 0; j < m_imgWidth * pixelByte; j++) 41 *(m_pImgDataOut+i*lineByteOut+j)= *(m_pImgData+i*lineByteOut+j); 42 } 43 //行处理(去掉边缘几行) 44 for (i = TempCY; i < m_imgHeight - TempH + TempCY + 1; i++) //m_imgHeight - (TempH -TempCY) + 1故弄玄虚!靠 45 { 46 //列处理(去掉边缘几列) 47 for (j = TempCX; j < m_imgWidth - TempW + TempCX + 1; j++) 48 { 49 //指向新DIB第i行第j列的像素的指针 50 pDst = m_pImgDataOut + lineByte * i + j; 51 value=0; 52 //计算 53 for (k = 0; k < TempH; k++) 54 { 55 for (l = 0; l < TempW; l++) 56 { 57 pSrc = m_pImgData + lineByte * (i + TempCY - k) + j - TempCX + l; 58 //计算加权平均,保存像素值 59 value += (*pSrc) * fpTempArray[k * TempW + l]; 60 } 61 } 62 //乘以系数 63 value *= f; 64 //取结果的绝对值 65 value=(float)fabs(value); 66 if (value > 255) 67 { 68 *pDst = 255; 69 } 70 else 71 { 72 *pDst = (unsigned char)(value + 0.5); 73 } 74 } 75 } 76 }
邻域平均算法思想简单易行,但是在减小噪声的同时让图像变得模糊。