自定义函数实现均值滤波


#include "opencv2/imgproc.hpp"

#include "opencv2/highgui.hpp"

#include

using namespace cv;

using namespace std;



//均值滤波
void AverFiltering(const Mat &src, Mat &dst) {
	if (!src.data) return;
	//at访问像素点
	for (int i = 1; i < src.rows; ++i)
		for (int j = 1; j < src.cols; ++j) {
			if ((i - 1 >= 0) && (j - 1) >= 0 && (i + 1) < src.rows && (j + 1) < src.cols) {//边缘不进行处理
				dst.at(i, j)[0] = (src.at(i, j)[0] + src.at(i - 1, j - 1)[0] + src.at(i - 1, j)[0] + src.at(i, j - 1)[0] +
					src.at(i - 1, j + 1)[0] + src.at(i + 1, j - 1)[0] + src.at(i + 1, j + 1)[0] + src.at(i, j + 1)[0] +
					src.at(i + 1, j)[0]) / 9;
				dst.at(i, j)[1] = (src.at(i, j)[1] + src.at(i - 1, j - 1)[1] + src.at(i - 1, j)[1] + src.at(i, j - 1)[1] +
					src.at(i - 1, j + 1)[1] + src.at(i + 1, j - 1)[1] + src.at(i + 1, j + 1)[1] + src.at(i, j + 1)[1] +
					src.at(i + 1, j)[1]) / 9;
				dst.at(i, j)[2] = (src.at(i, j)[2] + src.at(i - 1, j - 1)[2] + src.at(i - 1, j)[2] + src.at(i, j - 1)[2] +
					src.at(i - 1, j + 1)[2] + src.at(i + 1, j - 1)[2] + src.at(i + 1, j + 1)[2] + src.at(i, j + 1)[2] +
					src.at(i + 1, j)[2]) / 9;
			}
			else {//边缘赋值
				dst.at(i, j)[0] = src.at(i, j)[0];
				dst.at(i, j)[1] = src.at(i, j)[1];
				dst.at(i, j)[2] = src.at(i, j)[2];
			}
		}
}

//图像椒盐化

void salt(Mat &image, int num) {

	if (!image.data) return;//防止传入空图

	int i, j;

	srand(time(NULL));

	for (int x = 0; x < num; ++x) {

		i = rand() % image.rows;

		j = rand() % image.cols;

		image.at(i, j)[0] = 255;

		image.at(i, j)[1] = 255;

		image.at(i, j)[2] = 255;

	}

}

int  main() {

	Mat image = imread("F:/2.png");

	Mat Salt_Image;

	image.copyTo(Salt_Image);

	salt(Salt_Image, 3000);

	Mat image1(image.size(), image.type());

	Mat image2;

	AverFiltering(Salt_Image, image1);

	blur(Salt_Image, image2, Size(3, 3));//openCV库自带的均值滤波函数

	imshow("原图", image);
	
	imshow("图像椒盐化处理后", Salt_Image);
	
	imshow("自定义均值滤波", image1);
	
	imshow("openCV自带的均值滤波", image2);

	waitKey();

	return 0;

}

 

你可能感兴趣的:(自定义函数实现均值滤波)