计算机视觉攻略 图像滤波笔记3 (中值滤波器)

中值滤波器(非线性)

中值滤波器对消除椒盐噪声非常有效。中值滤波器把当前像素和它的邻域组成一个集合,然后计算出这个集合的中间值,以此作为当前像素的值(集合中数值经过排序,中间位置的数值就是中间值)。当前像素被中间值代替。
这正是中值滤波器在消除椒盐噪声时如此高效的原因。事实上,如果在某个像素邻域中有一个异常的黑色或白色像素,该像素将无法作为中间值(它是最大值或最小值),因此肯定会被领域的值替换掉。

中值滤波器函数 (#include <opencv2/imgproc/imgproc.hpp>)

void medianBlur(InputArray src, OutputArray dst, int ksize)

在这里插入图片描述

示例程序

#include <iostream>
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <random>

using namespace std;

void salt(cv::Mat image, int n);

int main(int argc, char** argv) {
    
    
    if( argc != 2)
    {
    
    
        cerr << "please enter the right numbers of images" << endl;
        return -1;
    }
    cv::Mat image = cv::imread(argv[1]);
    if (image.empty())
    {
    
    
        cerr << "don`t get the data of the argv[1]" << endl;
        return -1;
    }
    cv::imshow("The original image", image);
    cv::waitKey(0);
    salt(image, 1000);
    cv::imshow("The salt image",image);
    cv::waitKey(0);
    cv::Mat result;
    cv::medianBlur(image,result, 5);
    cv::imshow("The filter image", result);
    cv::waitKey(0);
    return 0;
}

void salt(cv::Mat image, int n)
{
    
    
    std::default_random_engine generator;   //#include <random>
    std::uniform_int_distribution<int>
            randomRow(0, image.rows - 1);
    std::uniform_int_distribution<int>
            randomCol(0, image.cols - 1);

    int i, j;
    for (int k = 0; k < n; k++){
    
    
        //随机数生成图形位置
        i = randomCol(generator);
        j = randomRow(generator);
        if(image.type() == CV_8UC1){
    
    
            // 灰度图像
            // 单通道8位图像
            image.at<uchar>(j, i) = 255;
        }else if(image.type() == CV_8UC3){
    
    
            //彩色图像
            //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/jlm7689235/article/details/107605201