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

Python098

用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

}

0,1,2,3,4,5} .0,1,2,3,4,5} c } ?Char a = “ string” ????Int a [] = “ string” 首先,a 是正确的,尽管数组的长度没有值,但它会自动确认数组的长度。C 的问题在于字符串的第一个地址被赋给了一个 char 变量。

按照题目要求写如下代码,后面附结果,如果满意,望采纳!

#include <stdio.h>

#include <stdlib.h>

#include <string.h>

double A[3][16] = {160,163,167,80,83,85,155,158,159,20,22,23,170,173,176,179,

   159,158,155,75,78,80,156,159,153,25,23,21,167,168,166,164,

   153,155,157,81,84,82,154,153,158,27,25,24,168,172,171,170} 

double mask[3][3] = {1,2,1,

 2,4,2,

 1,2,1}

void myfilter(double* p)

{

int i,j

for (i = 1 i <= 14 ++i)

{

/* code */

double sum = 0

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

{

sum += A[j][i-1]*mask[j][0] + A[j][i]*mask[j][1] + A[j][i+1]*mask[j][2]

}

// printf("sum=%lf\n", sum)

*p++ = sum/16

}

return

}

int main(int argc, char const *argv[])

{

/* code */

double ans[14]

double * p = ans

myfilter(p)

int i

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

{

printf("%.4lf\n", ans[i])

}

printf("\n")

system("pause")

return 0

}