opencv图像处理之椒盐噪声
发布时间
阅读量:
阅读量
Hellow,我是jack,今天给大家分享的是椒盐噪声。话不多说,让我们直接进入正题。
在添加椒盐时,我们需要的是随机添加,所以我们先来介绍一个函数
int rand(void);
rand()函数用来产生随机数,但是,rand()的内部实现是用线性同余法实现的,是伪随机数,由于周期较长,因此在一定范围内可以看成是随机的。
rand()会返回一个范围在0到RAND_MAX(至少是32767)之间的伪随机数(整数)。
在调用rand()函数之前,可以使用srand()函数设置随机数种子,如果没有设置随机数种子,rand()函数在调用时,自动设计随机数种子为1。随机种子相同,每次产生的随机数也会相同。
接着,让我们在介绍一下添加椒盐噪声的函数
cv ::Mat addSaltNoise(const cv ::Mat srcImage, int n)
//其中srcImage为原图片,n为椒盐噪声点的个数
知道了这些之后,那就让我们尝试一下代码实现吧!
int main() {
cv::Mat srcimage, equ;
cv::Mat blurimage, medianblurImage;
cv::Mat addSaltNoise(const cv::Mat, int);
cv::Mat image1 = cv::imread("D:\ 桌面\ girl.jpg");
//cv::imshow("原图", image1);
//
if (image1.empty())
return -1;
cv::Mat resultimage=addSaltNoise(image1,5000);
cv::imshow("image",image1);
cv::imshow("resultimage", resultimage);
cv::waitKey (0);
}
//添加椒盐噪声
cv::Mat addSaltNoise(const cv::Mat image1, int n) {
cv::Mat resultimage = image1.clone();
for (int k = 0; k < n; k++) {
//随机取值行列
int i = rand() % resultimage.cols;
int j = rand() % resultimage.rows;
//图像通道判断
if (resultimage.channels() == 1) {
if (rand() % 2) {
resultimage.at<uchar>(j, i) = 255;
}
else {
resultimage.at<uchar>(j, i) = 0;
}
}
else{
if (rand() % 2) {
resultimage.at<cv::Vec3b>(j, i)[0] = 255;
resultimage.at<cv::Vec3b>(j, i)[1] = 255;
resultimage.at<cv::Vec3b>(j, i)[2] = 255;
}
else {
resultimage.at<cv::Vec3b>(j, i)[0] = 0;
resultimage.at<cv::Vec3b>(j, i)[1] = 0;
resultimage.at<cv::Vec3b>(j, i)[2] = 0;
}
}
}
//cv::imshow("resultimage", resultiamge);
//cv::waitKey (0);
return resultimage;
}
源图像
结果图
你们学会了吗??有什么疑问可以一起探讨!
本章就和大家分享到这里,谢谢。
欢迎指正
全部评论 (0)
还没有任何评论哟~
