“-”表示边界上无法进行模板操作的点,一般的做法是复制原图的灰度值,不再进行任何其他的处理。模板操作实现了一种领域运算,即某个像素点的结果不仅和本像素灰度有关,而且和其领域点的值有关。下面对平滑的用途和解决方法进行详细介绍。
在图像的采集过程中,由于各种因素的影响,图像中往往会出现一些不规则的随机噪声,如数据在传输、存储时发生的数据丢失和损坏等,这些都会影响图像的质量。处理噪声点的过程称之为平滑,平滑可以降低图像的视觉噪声,同时除去图像中的高频部分后,那些本来不明显的低频成分更容易识别。而噪声点一般是孤
立的点,噪声点的像素灰度与它们的近邻像素有显著的区别,即灰度变化总在这附近有突变高频。平滑可用卷积来实现,平滑的频率截止点由卷积核的大小及卷积系数决定。用于平滑滤波的卷积核叫做低通过滤波器,低通过滤波器具有如下的特征:1卷积核的行、列数为奇数,通常为3×3的矩阵;2卷积系数以中心点为中心对称分布;3所有的卷积系数都为正数;4距离中心较远的卷积系数的值较小或保持不变;5卷积后的结果不改变图像的亮度。经过卷积平滑后给随后的水平投影、二值化提供了较好的图像效果。水平投影的曲线显得比较平滑,二值化后的图像孤立点比较少。以下是几个常用的卷积核: 1/9 1/9 1/9 1/10 1/10 1/10 1/16 2/16 1/16 1/9 1/9 1/9 1/10 1/5 1/10 2/16 4/16 2/16 1/9 1/9 1/9 1/10 1/10 1/10 1/16 2/16 1/16 L P1 LP2 LP3
通常的处理是:将中心点周围八个点的像素值乘于各自矩阵相应的系数后相加得到一个值,然后将这个值乘上中心点的系数,中心点的像素值赋为得到的最后值。一般来说,不同的噪声有各自针对性的卷积算法。本文使用的卷积算法是高斯卷积核,亦即上面卷积核的LP3。高斯卷积是通过采样2维高斯函数得到的。高斯平滑算法的优点是平滑后图像的失真少,算法更具备通用性,能去除不同的噪声干扰。需要注意的是:在平滑处理时,图像边界点无法处理,因此循环范围应设定在图像边界内。
(2) 具体实现高斯平滑功能
知道高斯平滑原理之后,可进行编码将其实现:
① 编辑菜单IDR_MAINFRAM,在菜单“预处理”中添加一子菜单项,命名为“高斯平滑”并将其ID设为ID_READY_Template。
② 在类CFaceDetectView中添加“高斯平滑”菜单项的事件处理程序,其代码如下:
//进行模板操作
Template(tem ,3,3, xishu);
Invalidate(TRUE);
其中tem是模板参数,xishu是模板系数;Template()函数是实现高斯平
21
滑的主要函数,其核心代码是:
for(m=i-((tem_h-1)/2);m<=i+((tem_h-1)/2);m++) {
for(n=j-((tem_w-1)/2);n<=j+((tem_w-1)/2);n++)
位置的系数进行相乘并线形叠加
}
将结果乘上总的模板系数 计算绝对值 sum = fabs(sum);
如果小于0,强制赋值为0
注: 将以点(i,j)为中心,与模板大小相同的范围内的象素与模板对用
sum+=Gray[m][n]* tem[(m-i+((tem_h-1)/2))*tem_w+n-j+((tem_w-1)/2)];
sum=(int)sum*xishu;
if(sum<0) sum=0;
③ 高斯平滑效果图:见下图 4-4
如果大于255,强制赋值为255 sum=255;
if(sum>255)
HeightTemplate[i][j] = sum;
图4-4 高斯平滑效果图
22
4、灰度均衡
(1)算法思想
灰度均衡也称直方图均衡,目的是通过点运算使输入转换为在每一灰度级上都有相同的像素点数的输出图像(即输出的直方图是平的)。这对于在进行图像比较或分割之前将图像转化为一级的格式是十分有效的。
按照图像的概率密度函数(PDF,归一化带单位面积的直方图)的定义: P(x) = 1A0 * H(x)(式5)
其中H(x)为直方图,A0为图像的面积,设转换前图像的概率密度函数为
Pr(r),转换后图像的概率密度函数为Ps(S),转换函数为s = f(r),由概率论知识,我们可以得到:
Ps(S) = Pr(r)* drds(式6)
这样,如果想使转换后图像的概率密度函数为1(即直方图是平的)则必须满足: Pr(r)= drds (式4-5) 等式两边积分,得:
S = f(r)=
∫r0 P2(u)du =1A0∫r0 H(u)du (式7)
该转换式被称为图像的累积分布函数
上面的式是被归一化后推导的对于没有归一化的情况,只要求以最大的灰度值(DMax,对于灰度图就是255)即可,灰度均衡的转换式为:
DB = f (DA)= DMaxA0 H(u)du (式1)
对于离散图像转换式为: DB = f(DA)= DMaxA0
DA?Hi (式8)
i?0
式中Hi为第i级灰度的像素个数。
(2)编程实现
在灰度均衡操作同样不需要改变DIB的调色板和文件夹,只要把指向DIB像素起始位置的指针和DIB高度、宽度信息传递给子函数就可以完成灰度均衡变换工作,其核心代码如下:
*(lpData + lOffset)=state ; //显示灰度均衡
23
*(lpData + lOffset+1)=state ; *(lpData + lOffset+2)=state ;
(3)效果图
图 4-5 灰度均衡效果图
5、图像对比度增强
(1) 算法思想:
在对图像均衡直方图处理以后,便可对图像进行对比度增强,进一步拉开对比度。它通过对图像的灰度值进行统计,对于比最小设定值小的则认为是有关的信息,则将它作为黑色处理,比最大设定值大的则认为是一些无关的信息,将它们去掉,而处于两者之间的,则进行对比度增强,将他们在总的灰度值里面的比例作为新的像素信息保存起来。
这个工作的主要目的是将图像的特征一步一步显现出来。
(2) 编码实现:
① 编辑菜单IDR_MAINFRAM,在菜单“预处理”中添加一子菜单项,命名为“实
现图像对比度增强”,并将其ID设为ID_READY_ContrastEnhance。
② 类CFaceDetectView中添加“实现图像对比度增强”菜单项的事件处理程序,其
代码如下;
lOffset = gDib.PixelOffset(i, j, gwBytesPerLine);
24
获取图像灰度增强函数
int state=IncreaseContrast(ZFT[k][k1], 100); 显示灰度增强后的图像 *(lpData + lOffset ) = state ; *(lpData + lOffset+1) = state ;
*(lpData + lOffset+2) = state ;
其中IncreaseContras()函数是实现图像对比度增强的关键函数,该根据参数n来调节对比度,n越大,对比越强烈,其核心是:
如果数据很小,设置为0 if(pByte<=Low)
③ 效果图 return 0;
获得中间数据,并进行对比增强处理 else if ((Low return int(((pByte-Low)/Grad)); 如果数据很大,设置为255 else return 255; 图4-6 对比度增强效果图 25