#椒盐噪声生成器
//=====================这个函数作用是对输入图像输出椒盐噪声=====================
//输入src源图像,输入格式图像名+图像格式,要求图像和程序处于相同文件夹
//调整椒盐噪声参数,输入s进行保存,输入q退出;
#include<opencv2/opencv.hpp>
#include<iostream>
using namespace cv;
using namespace std;
void SrcImgRead();
void DstImgWrite();
void AddSaltPepperNoise(int,void*);
Mat addSaltNoise(const Mat srcImage, int n);
string srcName;
Mat srctImg,dstImg;
string dstImgName;
int n = 0;//椒盐噪声参数
char key;//操作识别,输入q退出,输入s保存
int main()
{
SrcImgRead();
if (!testImg.data) {
cout << "读取图片失败,请检查文件路径或文件名" << endl;
getchar();
return false;
}
namedWindow("输入图像");
imshow("输入图像", testImg);
namedWindow("输出图像");
dstImg = testImg;
imshow("输出图像", dstImg);
createTrackbar("n*100", "输出图像", &n, 100, AddSaltPepperNoise);
while (waitKey(1) != 'q') {
if (waitKey(1) == 's') {
dstImgName = to_string(n*100);
dstImgName.append(".jpg");
imwrite(dstImgName,dstImg);
}
}
return 0;
}
/*图像输入*/
void SrcImgRead() {
cout << "请输入文件名" << endl;
getline(cin, srcName);
testImg = imread(srcName);
}
void AddSaltPepperNoise(int,void*) {
dstImg = addSaltNoise(testImg, 500 * n);
imshow("输出图像", dstImg);
}
Mat addSaltNoise(const Mat srcImage, int n)
{
Mat dstImage = srcImage.clone();
for (int k = 0; k < n; k++)
{
int i = rand() % dstImage.rows;//??t
int j = rand() % dstImage.cols;
if (dstImage.channels() == 1)
{
dstImage.at<uchar>(i, j) = 255; //盐噪声
}
else
{
dstImage.at<Vec3b>(i, j)[0] = 255;
dstImage.at<Vec3b>(i, j)[1] = 255;
dstImage.at<Vec3b>(i, j)[2] = 255;
}
}
for (int k = 0; k < n; k++)
{
int i = rand() % dstImage.rows;
int j = rand() % dstImage.cols;
if (dstImage.channels() == 1)
{
dstImage.at<uchar>(i, j) = 0; //椒噪声
}
else
{
dstImage.at<Vec3b>(i, j)[0] = 0;
dstImage.at<Vec3b>(i, j)[1] = 0;
dstImage.at<Vec3b>(i, j)[2] = 0;
}
}
return dstImage;
}