椒盐噪声的实现非常简单,原理就是把一幅图像里面的像素随机变成黑色或者白色,所以椒盐名字就是这么来的。
先看代码:
int noise_coeff=5;
for (int k = 0; k < (image.rows*image.cols); k++){
int j = k % image.cols;
int i = k / image.cols;
if ((rand() % 100) < noise_coeff)
{
int value = (i % 2 == 1) ? 0 : 255;
if (image.channels() == 1)
{
image.at<uchar>(j, i) = value;
}
else
{
image.at<cv::Vec3b>(i, j)[0] = value;
image.at<cv::Vec3b>(i, j)[1] = value;
image.at<cv::Vec3b>(i, j)[2] = value;
}
}
}
首先设定一个noise系数,这个越大,图像的噪声越多。然后判定生成的随机数取模后的大小与设定的系数大小关系,value用来决定该像素是黑色还是白色。如果图像为单通道那就直接赋值,如果是三通道,那就依次给三个通道赋值。
最后的效果图:
其他算法实现待续。