图像模糊操作
1.均值滤波
blur(Mat src,Mat dst,Size(xradius,yradius),Point(-1,-1));
输入图像,输出图像,滤波器大小,默认中心点(一般不做修改)
2.高斯滤波
GaussianBlur(Mat src,Mat dst,Size(x,y),sigmax,sigmay);
输入图像,输出图像,滤波器大小,x方向上的σ大小,y方向上的σ大小
#include"pch.h" #include<iostream> #include<opencv2/opencv.hpp> using namespace std; using namespace cv; int main(int argc, char **argv) { Mat src,dst1,dst2; src = imread("b.jpg"); if (src.empty()) { cout << "Load img failed..." << endl; return -1; } imshow("input image", src); blur(src, dst1, Size(5,5), Point(-1, -1)); imshow("blur img", dst1); GaussianBlur(src, dst2, Size(5,5), 11, 11); imshow("Gaussian blur img", dst2); waitKey(0); return 0; }
3.中值滤波
对抑制椒盐噪声有很好的效果(去除噪点)
对滤波器内的像素点进行排序,取中值代替中心像素点,同理也会有最大值最小值滤波
mddianBlur(Mat src,Mat dst,ksize)
ksize大于1且必须为基数
4.双边滤波
均值模糊会导致边缘像素信息丢失,因为均值滤波是基于平均权重
高斯滤波一定程度上改善了这一问题,但无法完全解决,因为没有考虑到像素值的不同
高斯双边模糊是边缘保留的滤波方法,避免了边缘信息的丢失,保留了图像轮廓不变(磨皮效果)
像素点值的高差没有被抹去,只是使得相同高度的区域变得更加平缓
bilateralFilter(src,dst,d=15,150,3)
15表示计算半径,半径之内的像素点都会纳入计算
150表示像素值的差,如果像素之差在150之内都会被计算
3 d值必须大于0否则声明无效,否则用它来计算d值
双边滤波加上掩膜操作就是美图的美颜操作
#include<iostream> #include<opencv2/opencv.hpp> using namespace std; using namespace cv; int main(int argc, char **argv) { Mat src,dst1,dst2; src = imread("c.jpg"); if (src.empty()) { cout << "Load img failed..." << endl; return -1; } imshow("input image", src); /* blur(src, dst1, Size(5,5), Point(-1, -1)); imshow("blur img", dst1); //GaussianBlur(src, dst2, Size(5,5), 11, 11); //imshow("Gaussian blur img", dst2); medianBlur(src, dst1, 3); imshow("median Blur img", dst1); */ bilateralFilter(src, dst2, 15, 150, 3); imshow("bilateral Blur img", dst2); Mat resImg; Mat Kernel = (Mat_<int>(3, 3) << 0, -1, 0, -1, 5, -1, 0, -1, 0); filter2D(dst2, resImg, -1, Kernel, Point(-1, -1), 0); imshow("Final Result", resImg); waitKey(0); return 0; }
无情的摸鱼机器