滤波
无论是直接获取的灰度图像,还是由彩色图像转换得到的灰度图像,里面都有噪声的存在,噪声对图像质量有很大的影响。进行中值滤波不仅可以去除孤点噪声,而且可以保持图像的边缘特性,不会使图像产生显著的模糊,比较适合于实验中的人脸图像。
中值滤波的基本思想是,把局部区域的像素按灰度等级进行排序,取该领域中灰度的中值作为当前像素的灰度值。
中值滤波的步骤为:
1、将滤波模板(含有若干个点的滑动窗口)在图像中漫游,并将模板中心与图中某个像素位置重合;
2、读取模板中各对应像素的灰度值;
3、将这些灰度值从小到大排列;
4、取这一列数据的中间数据,将其赋给对应模板中心位置的像素。如果窗口中有奇数个元素,中值取元素按灰度值大小排序后的中间元素灰度值。如果窗口中有偶数个元素,中值取元素按灰度值大小排序后,中间两个元素灰度的平均值。因为图像为二维信号,中值滤波的窗口形状和尺寸对滤波器效果影响很大,不同图像内容和不同应用要求往往选用不同的窗口形状和尺寸。
引用一段文字描述一下滤波的特点,通过上一篇文章的学习,我们已经学会了怎样用MFC实现基本的图像处理算法,这次我们需要实现的是中值滤波,这个算法的原理和上一篇文章的Otsu的原理我准备这两天总结一下,重写一篇文章。
下面开始用MFC实现中值滤波,我们和上一篇文章中的操作一样,在资源视图->Menu菜单->IDR-DIBTYPE里面的image processing下新建一个子菜单MedianFiltering
然后添加类向导,或者直接右键子菜单MediaFiltering添加事件处理程序
类列表选择CdibView其他默认,然后将OnImageprocessingMedianfiltering()函数重写如下:
void CDibView::OnImageprocessingMedianfiltering()
{
// TODO: 在此添加命令处理程序代码
// 获取文档
CDibDoc* pDoc = GetDocument();
// 指向DIB的指针
LPSTR lpDIB;
// 指向DIB象素指针
LPSTR lpDIBBits;
// 滤波器的高度
int iFilterH;
// 滤波器的宽度
int iFilterW;
// 中心元素的X坐标
int iFilterMX;
// 中心元素的Y坐标
int iFilterMY;
// 锁定DIB
lpDIB = (LPSTR) ::GlobalLock((HGLOBAL)pDoc->GetHDIB());
// 找到DIB图像象素起始位置
lpDIBBits = ::FindDIBBits(lpDIB);
// 判断是否是8-bpp位图(这里为了方便,只处理8-bpp位图的中值滤波,其它的可以类推)