在 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"<
输入图像
输出图像