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);
}