知识点:
1.中值滤波器对于去除椒盐噪点很有用
cv::medianBlur(image,result,5);
中值滤波器是非线性的,无法表示为一个核矩阵。该像素及它的相邻区域组成一组数组,仅仅计算这组数的中值,并用中值替代当前的像素值。
缺点:噪点像素使得相邻像素的平均值发生变化,结果中的噪点依然是可见的。还同时保留边缘锐利度的优点,也会去除相同区域中的纹理(如背景中的树木)。
#include <iostream>
#include <opencv2\opencv.hpp>
void salt(cv::Mat &image, int n); //图像中随机元素设置为白色(255)
int main()
{
cv::Mat image = cv::imread("C:\\Users\\Shenny Zhang\\Desktop\\2.jpg", 0);
cv::namedWindow("Original Image");
cv::imshow("Original Image", image);
// Salt the image
cv::Mat image2;
image.copyTo(image2);
salt(image2, 6000);
cv::namedWindow("Salt Image");
cv::imshow("Salt Image", image2);
// Applying a median filter
cv::Mat image3;
image2.copyTo(image3);
cv::medianBlur(image2, result, 5);
// Display the blurred image
cv::namedWindow("Median filtered S&P Image");
cv::imshow("Median filtered S&P Image", result);
cv::waitKey(0);
return 0;
}
void salt(cv::Mat &image, int n)
{
for (int k = 0; k < n; k++)
{
int i = rand() % image.cols;
int j = rand() % image.rows;
if (image.channels() == 1)
{
image.at<uchar>(j, i) = 255;
}
else if (image.channels() == 3)
{
image.at<cv::Vec3b>(j, i)[0] = 255; //通道表示方法
image.at < cv::Vec3b>(j, i)[1] = 255;
image.at<cv::Vec3b>(j, i)[2] = 255;
}
}
}