• opencv:边缘保留滤波


    EPF滤波概述

    均值与滤波的缺点:并没有考虑中心像素点对整个输出像素的贡献,实际上锚定的那个点贡献应该是最大的

    高斯滤波的缺点:当边缘值梯度很大的时候,应减少中心像素点的权重,而高斯滤波没有考虑

    边缘保留滤波:

    • 高斯双边
    • 均值迁移
    • 局部均方差

    高斯双边滤波

    非局部均值滤波

    example

    #include <opencv2/opencv.hpp>
    #include <iostream>
    
    using namespace cv;
    using namespace std;
    
    void add_salt_and_pepper_noise(Mat& image);
    void add_gaussian_noise(Mat& image);
    
    int main(int argc, char** argv)
    {
        Mat src = imread("f:/images/lena.jpg");
        if (src.empty())
        {
            printf("Could not find the image!
    ");
            return -1;
        }
    
        namedWindow("input", WINDOW_AUTOSIZE);
        imshow("input", src);
    
        //add_salt_and_pepper_noise(src);
        add_gaussian_noise(src);
        Mat dst;
        // 中值滤波
        medianBlur(src, dst, 3);
        imshow("median denoise demo", dst);
    
        // 高斯滤波  高斯滤波对椒盐噪声去噪效果不理想
        GaussianBlur(src, dst, Size(5, 5), 0);
        imshow("guassian denoise demo", dst);
    
        // 高斯双边
        bilateralFilter(src, dst, 0, 100, 10);
        imshow("bilateralF denoise demo", dst);
    
        // 如果不加噪声, 直接进行高斯双边,去掉微小细节,保留边缘
        src = imread("f:/images/lena.jpg");
        bilateralFilter(src, dst, 0, 100, 10);
        imshow("src - bilateralFilter", dst);
    
        // NLM 非局部均值去燥
        src = imread("f:/images/lena.jpg");
        add_gaussian_noise(src);
    		// 除了彩色版本,还有灰度版本等一些其他版本
        fastNlMeansDenoisingColored(src, dst, 3., 3., 7, 21);
        imshow("NLM", dst);
    
        waitKey(0);
        destroyAllWindows();
    
        return 0;
    }
    
    void add_salt_and_pepper_noise(Mat& image) {
        RNG rng(12345);
        int h = image.rows;
        int w = image.cols;
        int nums = 10000;
        for (int i = 0; i < nums; i++) {
            int x = rng.uniform(0, w);
            int y = rng.uniform(0, h);
            if (i % 2 == 1) {
                image.at<Vec3b>(y, x) = Vec3b(255, 255, 255);
            }
            else {
                image.at<Vec3b>(y, x) = Vec3b(0, 0, 0);
            }
        }
        imshow("salt and pepper noise", image);
    }
    
    void add_gaussian_noise(Mat& image) {
        // 高斯噪声
        Mat noise = Mat::zeros(image.size(), image.type());
        // 图像,均值,方差,显示一幅随机图像
        randn(noise, Scalar(15, 25, 45), Scalar(30, 30, 30));
        Mat dst;
        add(image, noise, dst);
        dst.copyTo(image);
        imshow("gaussian noise", image);
    }
    
  • 相关阅读:
    抓包工具 Fiddler 使用介绍
    HTTP 协议常见首部字段
    HTTP 协议服务器相关概念
    HTTP 协议常见的状态码
    HTTP 协议中 GET 和 POST 方法详解
    设置html title标题左侧的小图标
    HTML页面如何判断是手机访问还是电脑访问
    使用Java的Frame类编写的QQ登录界面
    swing中JTable的使用方法
    采用MVC模式JDBC演示案例
  • 原文地址:https://www.cnblogs.com/wbyixx/p/12305635.html
Copyright © 2020-2023  润新知