话不多说,直接上代码
#include<iostream>
#include<opencv2/opencv.hpp>
#define MAX 100
using namespace cv;
using namespace std;
void Sort(int* a, int n) //把数组a递增排序
{
for(int i=0;i<n;i++)
for (int j = i + 1; j < n; j++)
{
if (a[i] > a[j]) {
int tmp = a[i];
a[i] = a[j];
a[j] = tmp;
}
}
}
//图像填充
void img_Filling(Mat& srcImg, Mat& dstImg, int n) //图像上下左右各填充n/2行n/2列![在这里插入图片描述](https://img-blog.csdnimg.cn/20191111232904388.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQzNTE1ODMy,size_16,color_FFFFFF,t_70)
{
dstImg = Mat::zeros(srcImg.rows + n-1, srcImg.cols + n-1, srcImg.type());
for (int i = 0; i < srcImg.rows; i++) //对行操作
{
for (int j = 0; j < srcImg.cols; j++) //对列操作
{
for (int c = 0; c < 3; c++) //分别对B G R操作
{
uchar* data1 = srcImg.ptr<uchar>(i, j);
uchar* data2 = dstImg.ptr<uchar>(i + n / 2, j + n / 2);
data2[c] = data1[c];
}
}
}
}
//n*n中值滤波
void Mid_Filter(Mat& srcImg, Mat& dstImg, int n)
{
Mat tmp;
img_Filling(srcImg, tmp, n); //图像填充
for (int i = n / 2; i < srcImg.rows + n / 2; i++) //对填充后的图像从有图像区域开始滤波
{
for (int j = n / 2; j < srcImg.cols + n / 2; j++)
{
for (int c = 0; c < 3; c++)
{
int A[MAX] = {0};
for (int m = 0; m < n*n; m++)
A[m] = tmp.at<Vec3b>(i - n / 2 + m / n, j - n / 2 + m % n)[c];
Sort(A, n*n);
dstImg.at<Vec3b>(i-n/2, j-n/2)[c] = A[(n*n)/2];
}
}
}
}
void main()
{
Mat srcImg = imread("lena(椒盐).png");
Mat dstImg = Mat::zeros(srcImg.rows, srcImg.cols, srcImg.type());
Mid_Filter(srcImg, dstImg,3);
imshow("原图", srcImg);
waitKey(100);
imshow("中值滤波", dstImg);
imwrite("result.jpg", dstImg);
waitKey();
}
示例