多语言展示
当前在线:932今日阅读:126今日分享:42

怎样对图像进行均值滤波

这个经验,主要是针对机器视觉中怎样进行均值滤波来达到图像增强的目的。
效果展示

END

工具/原料
1

一个可以解析图像的类,比如说OpenCV,当然OpenCv的话不用具体编码也可以完成这个功能,我这里主要谈的是如何使用自己的编写的解析图像的类来完成图像增强。如果您还没有这个类的话,可以参考我写的“如何编写基本的BMP格式解析类”这一经验来完成一个自己的类(并且通过这篇文章,可以丰富自己的类的功能哟)

2

具有C++编译器的GUI操作系统,起码你得看到你写的效果对吧。

3

C++的编译器,这里笔者用的是Visual Studio 2005。

步骤/方法
1

创建一个函数,名为AveSmooth。 对于VS2005,请在类上单击添加函数,然后填写函数格式即可。

2

然后,对原图像进行复制,此处很重要,要不复制一份的话,新图像和老图像都用同一的空间的话,一定会把新图像产生的点作为老图像的点,从而导致悲剧。

3

遍历图像的每一个点,对其周围八个点和自己的像素值取平均,作为新图像的点。做完即可。

代码示例
1

bool AveSmooth() {

2

//复制新图像,进行处理。ModalFrom为复制新图像的函数,参数是指向图像的指针。 ImageBase则是图像的类。 ImageBase ibNew; ibNew.ModalFrom(this);

3

//把沿着图片边缘的1px边际忽略,也可以用适当的方法计算。 for(int i=1;i

4

//求平均值并进行处理 double dSum = GetPixel(i-1,j-1) + GetPixel(i-1,j) +GetPixel(i-1,j+1) +GetPixel(i,j-1) +GetPixel(i,j) +GetPixel(i,j+1) +GetPixel(i+1,j-1) +GetPixel(i+1,j) +GetPixel(i+1,j+1) ; ibNew.SetPixel(i,j,int(dSum/9 + 0.5));

5

} }

6

//复制到源图像。 this.ModalFrom(&ibNew); return true; }END

注意事项
1

对于步骤1,可以使用VS2005自带的函数创建功能,但此功能速度比较慢。

2

对于步骤3,均值一定得使用浮点类型,以防止数据流失。

3

对于步骤3,可以考虑在得到的浮点上加0.5来取整来提高精度。

4

对于步骤3,图像周围的一圈应给予考虑,最简单的办法为不处理这一圈。

推荐信息