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("E:\\open CV\\VS\\image\\6.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;

}
//

编译环境:VS2017+opencv4.0

编译过程问题分析:

(1)弹出bug:“assertion failed((unsigned)i0<(unsigned)size.p[0]) in cv::Mat::at"一般有两个原因:

一是下标索引超出了界限;二是图像的行和列在读取或者写入是搞反了。

 

  • 1
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值