归一化滤波器 (Normalized Box Filter)
高斯滤波器 (Gaussian Filter)
双边滤波器 (Bilateral Filter)
已经解释了一些主要目标是平滑输入图像的滤镜。但是,有时滤镜不仅可以消除噪音,还可以平滑边缘。为了避免这种情况(至少在某种程度上),我们可以使用双边滤波器。
以与高斯滤波器类似的方式,双边滤波器还考虑具有分配给它们中的每一个的权重的相邻像素。这些权重有两个分量,第一个是高斯滤波器使用的相同权重。第二个组件考虑了相邻像素和评估像素之间的强度差异。
API : bilateralFilter(Mat src,Mat dst,int d,double sigmaColor,double sigmaSpace, int borderType)
src : 源8位或浮点,1通道或3通道图像。
dst : 与src具有相同大小和类型的目标映像。
d : 过滤期间使用的每个像素邻域的直径。如果它是非正数,则从sigmaSpace计算。
sigmaColor : 过滤颜色空间中的西格玛。参数的值越大意味着像素邻域内的更远的颜色(参见sigmaSpace)将混合在一起,从而产生更大的半等颜色区域。
sigmaSpace : 在坐标空间中过滤西格玛。较大的参数值意味着只要它们的颜色足够接近,更远的像素就会相互影响(参见sigmaColor)。当d> 0时,无论 sigmaSpace如何,它都指定邻域大小。否则,d与sigmaSpace成比例。
borderType : 用于外推图像外部像素的边框模式
中位数滤波器 (Median Filter)
#include
#include
using namespace cv;
int main(int argc, char** argv) {
Mat srcImage,dst;
srcImage = imread("E:/image/6.jpg");
if (srcImage.empty()) {
printf("没有找到图片");
return -1;
}
namedWindow("input_image", WINDOW_AUTOSIZE);
imshow("input_image", srcImage);
blur(srcImage, dst, Size(7, 7), Point(-1, -1));
namedWindow("blur_image", WINDOW_AUTOSIZE);
imshow("blur_image", dst);
waitKey(0);
return 0;
}
效果图:
#include
#include
using namespace cv;
int main(int argc, char** argv) {
Mat srcImage,dst;
srcImage = imread("E:/image/6.jpg");
if (srcImage.empty()) {
printf("没有找到图片");
return -1;
}
namedWindow("input_image", WINDOW_AUTOSIZE);
imshow("input_image", srcImage);
GaussianBlur(srcImage, dst, Size(7, 7),11,11);
namedWindow("GaussianBlur_image", WINDOW_AUTOSIZE);
imshow("GaussianBlur_image", dst);
waitKey(0);
return 0;
}
效果图:
#include
#include
using namespace cv;
int main(int argc, char** argv) {
Mat srcImage,dst;
srcImage = imread("E:/image/6.jpg");
if (srcImage.empty()) {
printf("没有找到图片");
return -1;
}
namedWindow("input_image", WINDOW_AUTOSIZE);
imshow("input_image", srcImage);
medianBlur(srcImage,dst,3);
namedWindow("medianBlu", WINDOW_AUTOSIZE);
imshow("medianBlu", dst);
waitKey(0);
return 0;
}
效果图:
#include
#include
using namespace cv;
int main(int argc, char** argv) {
Mat srcImage,dst;
srcImage = imread("E:/image/6.jpg");
if (srcImage.empty()) {
printf("没有找到图片");
return -1;
}
namedWindow("input_image", WINDOW_AUTOSIZE);
imshow("input_image", srcImage);
bilateralFilter(srcImage,dst,15,150,3);
namedWindow("bilateralFilter", WINDOW_AUTOSIZE);
imshow("bilateralFilter", dst);
waitKey(0);
return 0;
}
效果图:
#include
#include
using namespace cv;
int main(int argc, char** argv) {
Mat srcImage,dst;
srcImage = imread("E:/image/6.jpg");
if (srcImage.empty()) {
printf("没有找到图片");
return -1;
}
namedWindow("input_image", WINDOW_AUTOSIZE);
imshow("input_image", srcImage);
bilateralFilter(srcImage,dst,15,150,3);
namedWindow("bilateralFilter", WINDOW_AUTOSIZE);
imshow("bilateralFilter", dst);
Mat result;
Mat kernal = (Mat_(3, 3) << 0, -1, 0, -1, 5, -1, 0, -1, 0);
filter2D(dst, result, -1, kernal,Point(-1,-1),0);
imshow("bilateralFilter_filter2D_result", result);
waitKey(0);
return 0;
}
效果图: