opencv——椒盐噪声添加与去除

目录

常见噪声及产生原因

代码

#include <opencv2/opencv.hpp>
#include <iostream>
using namespace cv;
using namespace std;
//添加椒盐噪声
Mat addSaltNoise(Mat srcImage, int n)
{
	Mat resultImage = srcImage.clone();
	for (int k = 0; k < n; k++)
	{
		//随机取行列值
		int i = rand() % resultImage.cols;		
		//%是求余运算,rand求随机数,一起是求0-图像列值之间的随机数
		int j = rand() % resultImage.rows;
 
		if (resultImage.channels() == 1) {
			resultImage.at<uchar>(j, i) = 255;
		}
		else
		{
			resultImage.at<Vec3b>(j, i)[0] = 255;
			resultImage.at<Vec3b>(j, i)[1] = 255;
			resultImage.at<Vec3b>(j, i)[2] = 255;
		}
		
	}
	return resultImage;
}
 
//均值滤波
Mat myAverage(Mat& srcImage)
{
	if (srcImage.channels() != 1) { cvtColor(srcImage, srcImage, COLOR_BGR2GRAY); }
	imshow("gray", srcImage);
	Mat dstImage = Mat::zeros(srcImage.size(), srcImage.type());
	//Mat mask = Mat::ones(3, 3, srcImage.type());
	
	for (int k = 1; k < srcImage.rows-1; k++) 
	{
		for (int n = 1; n < srcImage.cols - 1; n++) 
		{
			uchar f = 0;
			for (int i = -1; i <= 1; i++) 
			{
				for (int j = -1; j <= 1; j++) 
				{
					f += srcImage.at<uchar>(k + i, n + j);
					
				}
			}
			dstImage.at<uchar>(k, n) =uchar( f / 9);
		}
	}
	return dstImage;
}
 
//中值滤波
Mat myMedian(Mat& srcImage)
{
	Mat dstImage = srcImage.clone();
	//定义一个向量List
	vector<uchar>List;
	//遍历图像源
	for (int k = 1; k < srcImage.cols - 1; k++)
	{
		for (int n = 1; n < srcImage.rows - 1; n++) {
			
			//对模板窗口进行遍历
			for (int i = -1; i <= 1; i++)
			{
				for (int j = -1; j <= 1; j++)
				{
					//将窗口内的像素放进向量内
					List.push_back(srcImage.at<uchar>(n + j, k + i));
				}
			}
			//对窗内元素进行排序
			sort(List.begin(), List.end());
			//取向量的中间元素作为当前元素
			dstImage.at<uchar>(n, k) = List[5];
			//清除当前向量内的元素
			List.clear();
		}
	}
	return dstImage;
}
int main()
{
	Mat srcImage = imread("C:/Users/86176/Pictures/pics/house.jpg");
	if (srcImage.empty()) { printf("no image\n"); return -1; }
	Mat resultImage=addSaltNoise(srcImage, 5000);
	imshow("原图", srcImage);
	imshow("椒盐", resultImage);
	Mat dstImage = myAverage(resultImage);
	imshow("均值滤波", dstImage);
	Mat dst = myMedian(resultImage);
	imshow("中值滤波", dst);
 
	waitKey(0);
	return 0;
 
}
//

效果

原图
原图
添加椒盐噪声
在这里插入图片描述
均值滤波
在这里插入图片描述
中值滤波
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Spark!

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值