用C++语言实现中值滤波

用C++语言实现中值滤波,第1张

这个filter是用来平滑图像用的,简单来说是对一幅(width * height)大小的图像按下述方法进行平滑化,以达到除去图像中噪声的目的。

首先把输入图像中每个像素点和该像素点四周的8个像素点作为一组来看,将这9个像素点的灰度进行排序后取最中间的那个灰度值作为这个像素点平滑化后的灰度值。

参数corrupted用来指向一幅有噪声的图像空间,参数smooth用来指向平滑化处理后的图像空间,width和height分别为图像的宽和高。

那么做main函数就应该知道怎么写了才对。

如果你能读入一幅图像并把图像里的各像素点保存到一个unsigned char数组里是最好的,不能的话可以自己虚构一幅图像来尝试滤波。

比如我们有下述5*5大小的图像(灰度范围0-255):

static unsigned char image[] = {

50, 50, 50, 50, 50,

50, 52, 48, 50, 50,

50, 50, 50, 0, 50,

50, 48, 53, 50, 50,

50, 50, 50, 50, 50,

}

本来这幅图像应该是全租吵灰度为50的图像,但是现在某些像素点混入了噪声(非50的像素点即为噪声)

把它送入medianFilter后即可得到平滑化后的全灰度为50的图像。

参考代码:

#include <memory.h>

#include <stdio.h>

 

static unsigned char image[] = {

    50,     50,     50,     50,     50,

    50,     52,     48,     50,     50,

    50,     50,     50,     0,      50,

    50,     48,     53,     50,     50,

    50,     50,     50,     50,     50,

}

#define WIDTH  5

#define HEIGHT 5

 

void medianFilter (unsigned char* corrupted, unsigned char* smooth, int width, int height)  

{  

    memcpy ( smooth, corrupted, width*height*sizeof(unsigned char) )  

    for (int j=1j<height-1j++)  

    {  

        for (int i=1i<width-1i++)  

        {  

            int k = 0  

            unsigned char window[9]  

            for (int jj = j - 1 jj < j + 2 ++jj)  

                for (int ii = i - 1 ii < i + 2 ++ii)  

                 搜运   window[k++] = corrupted[jj * width + ii]  

            //   Order elements (only half of them)  

            for (int m = 0 m < 5 ++m)  

            {  

                int min = m  

                for (int n = m + 1 n < 9 ++n)  

                    if (window[n] < window[min])  

                        min = n  

                //   Put found minimum element in its place  

                unsigned char temp = window[m]  

                window[m] = window[min]  

                window[min] = temp  

            }  

            smooth[ j*width+i ] = window[4]  

        }  

    }  

}  

 

int main()

{

    unsigned char output[WIDTH * HEIGHT]

    int i, j

    medianFilter(image, output, WIDTH, HEIGHT)

    for(i=0 i<HEIGHT i++)

    {

        for(j=0 j<WIDTH j++)

  世型梁      {

            printf("%d\t", output[i*WIDTH+j])

        }

        printf("\n")

    }

    return 0

}

可以告诉你方法:算数平均滤波,就是求出k次采样值的总和,再除以k;中值滤波法,是把k个采样值按照从小到大排列顺序,然后找到位于最中间的那个值;最后一种差薯正不知道你们老师的防脉冲是什么意思,猜测可能是去掉k次采样值中大于虚悔或小于某个值,剩余值求平均数。手迅

让别人免费给你写程序基本上不可能,这个得花时间和精力。

使用visual studio 2010编写一个c++程序:

1、创建项目,可以通过菜单:文件-新建-项目;也可以通过工具栏点击新建项目进行创建。这里点击起始页面上面的新建项目:

2、点击之判空绝后进入新建项目向导:

3、上面选择Win32控制台应用程序,名称中输入HelloWorld点确定,至于是否为解决方案创建目录我们暂时不管,那主要区别在亏燃于解决方案是否和项目文件在同一目录。

4、 接下来进入创建页面,在Win32应用程序向导的第一个页面直接点下一步即可:

5、下个页面记得选择空项目,因为不需要预编译头:

6、点击完成。 这时候一个空的项目编译成功了,不妨编译一些试试。点击刚才添加的生成工具栏的生成按钮:

7、添加代码:

8、在向导中掘姿选择代码、C++文件(.cpp),名称输入Main,确定。

9、输入最简单的几行代码,然后编译它:

10、用Ctrl+F5或者点那个空心三角形运行结果:


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/8280400.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-15
下一篇 2023-04-15

发表评论

登录后才能评论

评论列表(0条)

保存