用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

}

//中值滤波和均值大概这个样子

int nByteWidth=nWidth*3

if (nByteWidth%4) nByteWidth+=4-(nByteWidth%4)

BYTE p[9],s

int i,j

for(y=1y<nHeight-1y++)

{

for(x=3x<nWidth*3-3x++)

{

//把一个像素周围的8个像素值分别赋值给p[0]到p[8]

p[0]=lpInput[x-3+(y-1)*nByteWidth]

p[1]=lpInput[x+(y-1)*nByteWidth]

p[2]=lpInput[x+3+(y-1)*nByteWidth]

p[3]=lpInput[x-3+y*nByteWidth]

p[4]=lpInput[x+y*nByteWidth]

p[5]=lpInput[x+3+y*nByteWidth]

p[6]=lpInput[x-3+(y+1)*nByteWidth]

p[7]=lpInput[x+(y+1)*nByteWidth]

p[8]=lpInput[x+3+(y+1)*nByteWidth]

//将p[0]到p[8]从小到大排列

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

{

for(i=j+1i<9i++)

{

if (p[j]>p[i])

{

s=p[j]

p[j]=p[i]

p[i]=s

}

}

}

//将友隐各点的中值赋值给该像素

lpOutput[x+y*nByteWidth]=p[4]

}

//----------------------------------------

int sr,sg,sb

int nByteWidth=nWidth*3

if (nByteWidth%4) nByteWidth+=4-(nByteWidth%4)

for(y=1y<nHeight-1y++)

{

for(x=1x<nWidth-1x++)

{

p=x*3+y*nByteWidth

sb=0

sg=0

sr=0

for(y1=-1y1<=1y1++)

for(x1=-1x1<=1x1++)

{

//像素本身及其周围好宴厅的八个像素(3X3窗口内的像素)的blue值之和

sb+=lpInput[(y+y1)*nByteWidth+(x+x1)*3]

//像素本身及其周围的八个像素(3X3窗口内的像素)的green值之和

sg+=lpInput[(y+y1)*nByteWidth+(x+x1)*3+1]

//像素本身及其周围的八个像素(3X3窗口内的像素)的red值之和

sr+=lpInput[(y+y1)*nByteWidth+(x+x1)*3+2]

}

//将red,green,blue值的平均值赋值给该像素祥雹

lpOutput[p+2]=sr/9

lpOutput[p+1]=sg/9

lpOutput[p]=sb/9

}

}


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

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

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

发表评论

登录后才能评论

评论列表(0条)

保存