中值滤波器

知识点:
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;
        }
    }
}

猜你喜欢

转载自blog.csdn.net/a839766550/article/details/78258154