📌  相关文章
📜  在 C++ 中使用中值滤波器去除噪声

📅  最后修改于: 2022-05-13 01:54:38.344000             🧑  作者: Mango

在 C++ 中使用中值滤波器去除噪声

中值滤波是一种非线性过程,可用于减少脉冲噪声或椒盐噪声。中值滤波器还用于在降低噪声的同时保留边缘属性。此外,平滑技术(如高斯模糊)也用于降低噪声,但不能保留边缘属性。中值滤波器被广泛用于数字图像处理,只是因为它保留了边缘属性。

方法 :

  • 将输入图像的像素值存储在数组中。
  • 对于每个像素值,将包括该单元格在内的所有相邻像素值存储在一个新数组(称为窗口)中。
  • 对窗口数组进行排序。
  • 窗口数组的中值用于存储输出图像像素强度。

边界问题示例:
使用 3 x 3 采样窗口的 2D 中值滤波示例:
使用边界值将边界值扩展到外部。

边缘保留:
所有平滑技术都用于消除噪声。中值滤波也是和高斯滤波一样的一种平滑技术,但是中值滤波和高斯滤波的唯一区别是中值滤波保留了边缘属性,而高斯滤波没有。边缘保留是一个重要的属性,因为边缘对于视觉外观很重要。为了边缘保留特性,中值滤波器被广泛应用于数字图像处理中。

中值滤波算法的 C++ 实现。

C++
#include 
#include 
#include 
using namespace std;
 
/* Function to sort an array using insertion sort*/
void insertionSort(int arr[], int n)
{
    int i, key, j;
    for (i = 1; i < n; i++)
    {
        key = arr[i];
        j = i - 1;
 
        /* Move elements of arr[0..i-1], that are
        greater than key, to one position ahead
        of their current position */
        while (j >= 0 && arr[j] > key)
        {
            arr[j + 1] = arr[j];
            j = j - 1;
        }
        arr[j + 1] = key;
    }
}
 
int array[2000][2000];
int arr[2000][2000];
int main()
{
    int window[9],row = 0, col = 0, numrows = 0, numcols = 0,MAX=0;
    ifstream infile("Saltpepper.pgm");
    stringstream ss;
    string inputLine = "";
 
    // First line : version
    getline(infile,inputLine);
    if(inputLine.compare("P2") != 0) cerr << "Version error" << endl;
    else cout << "Version : " << inputLine << endl;
 
    // Continue with a stringstream
    ss << infile.rdbuf();
 
    // Secondline : size of image
    ss >> numcols >> numrows >> MAX;
 
    //print total number of rows, columns and maximum intensity of image
    cout << numcols << " columns and " << numrows << " rows" <> array[row][col];
        }
    }
 
 
    // Now print the array to see the result
    for(row = 1; row <= numrows; ++row)
    {
        for(col = 1; col <= numcols; ++col)
        {
            //neighbor pixel values are stored in window including this pixel
            window[0] = array[row-1][col-1];
            window[1] = array[row-1][col];
            window[2] = array[row-1][col+1];
            window[3] = array[row][col-1];
            window[4] = array[row][col];
            window[5] = array[row][col+1];
            window[6] = array[row+1][col-1];
            window[7] = array[row+1][col];
            window[8] = array[row+1][col+1];
 
            //sort window array
            insertionSort(window,9);
            //put the median to the new array
            arr[row][col]=window[4];   
        }
    }
 
    ofstream outfile;
     
    //new file open to store the output image
    outfile.open("Medianfilter.pnm");
    outfile<<"P2"<


输入图像

输出图像