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!\n");
        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);
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM