09-图像模糊(一)
模糊原理
-
Smooth/Blur是图像处理中最简单和常用的操作之一
-
使用该操作的目的之一是为了在图像预处理时降低噪声
-
使用Smooth/Blur操作背后的数学卷积计算是
g ( i , j ) = ∑ k , l f ( i + k , j + l ) h ( k , l ) g(i,j) = \sum _{k,l}f(i+k,j+l)h(k,l) g(i,j)=∑k,lf(i+k,j+l)h(k,l),其中 h ( k , l ) h(k,l) h(k,l) 为卷积算子(卷积核/掩膜)
例如:
-
通常这些卷积算子计算都是线性操作,故又叫做线性滤波
-
均值滤波原理
K = 1 K w e i g h t K h e i g h t ∣ 1 1 ⋯ 1 1 1 ⋯ 1 ⋮ ⋮ ⋱ ⋮ 1 1 ⋯ 1 ∣ K=\frac{1}{K_{weight}{K_{height}}}\left| \begin{matrix} 1 & 1 & \cdots & 1\\ 1 & 1 & \cdots & 1\\ \vdots & \vdots & \ddots & \vdots \\ 1 & 1 & \cdots & 1\\ \end{matrix} \right| K=KweightKheight1∣∣∣∣∣∣∣∣∣11⋮111⋮1⋯⋯⋱⋯11⋮1∣∣∣∣∣∣∣∣∣
-
高斯滤波原理
G 0 ( x , y ) = A e − ( x − μ x ) 2 2 σ x 2 + − ( y − μ y ) 2 2 σ y 2 G_0(x,y)=Ae^{\frac{-(x-\mu_x)^2}{2{\sigma_x}^2}+\frac{-(y-\mu_y)^2}{2{\sigma_y}^2}} G0(x,y)=Ae2σx2−(x−μx)2+2σy2−(y−μy)2
相关API
-
均值模糊
blur(Mat src, Mat dst, Size(xradius,yradius),Point(-1,-1)); //Size(xradius,yradius)表示窗口在x,y两个方向上的长度,必须为正奇数 //Point(-1,-1)表示窗口中心
-
高斯模糊
GaussianBlur(Mat src, Mat dst, Size(3,3), double sigmaX, double sigmaY); //其中Size(xradius,yradius)中xradius,yradius表示窗口在x,y两个方向上的长度,必须为正奇数 //SigmaX和SigmaY为上述原理公式中的两个参数值
代码演示
#include<opencv2/opencv.hpp>
#include<iostream>
using namespace std;
using namespace cv;
int main() {
Mat src = imread("D:\\heroRcData\\opencvProject\\arrowImg\\02\\01.jpg");
if (!src.data) {
cout << "could not load image..." << endl;
return -1;
}
namedWindow("input image", CV_WINDOW_AUTOSIZE);
imshow("input image", src);
//**************************************************
//均值滤波
Mat dst_blur;
blur(src, dst_blur, Size(5, 5), Point(-1, -1));
string blur_window = "blur image";
namedWindow(blur_window, CV_WINDOW_AUTOSIZE);
imshow(blur_window, dst_blur);
//**************************************************
//高斯滤波
Mat dst_Gauss;
GaussianBlur(src, dst_Gauss, Size(5, 5), 11, 11);
string Gauss_window = "Gauss image";
namedWindow(Gauss_window, CV_WINDOW_AUTOSIZE);
imshow(Gauss_window, dst_Gauss);
waitKey(0);
return 0;
}