目錄
一、前言
二、圖像濾波
1、圖像濾波
2、線性濾波器
三、OpenCV中的線型濾波操作
1、方框濾波——boxblur函數
2、均值濾波——blur函數
3、高斯濾波——GaussianBlur函數
一、前言
今天要講的是圖像線性濾波原理與操作,圖像濾波包括線性濾波與非線性濾波,今天我們要講的是線性濾波,包括方框濾波、均值濾波與高斯濾波。
如果想看其他有關于OpenCV學習方法介紹、學習教程、代碼實戰、常見報錯及解決方案等相關内容,可以直接看我的OpenCV分類:
二、圖像濾波
1、圖像濾波
1.定義
對于圖像濾波的标準定義如下:
圖像濾波,即在盡量保留圖像細節特征的條件下對目标圖像的噪聲進行抑制,是圖像預進行中不可缺少的操作,其處理效果的好壞将直接影響到後續圖像處理和分析的有效性和可靠性。
2.目的
根據定義我們可以知道,圖像濾波主要有如下兩個目的:
(1)對圖像進行降噪處理;
(2)提取圖像中物體的特征。
3.分類
圖像濾波主要分為兩類:線性濾波與非線性濾波。常用的線性與非線性濾波如下:
(1)線性濾波:方框濾波、均值濾波、高斯濾波;
(2)非線性濾波:中值濾波、雙邊濾波
2、線性濾波器
1.線性濾波器分類
線性濾波器經常用于剔除輸入信号中不想要的頻率或者從許多頻率中選擇一個想要的頻率。幾種常見的線性濾波器如下:
(1)低通濾波器:允許低頻率的波通過。
(2)高通濾波器:允許高頻率的波通過的。
(3)帶通濾波器:允許一定範圍頻率的波通過。
(4)帶阻濾波器:阻止一定範圍頻率的波通過并且允許其它頻率的波通過。
(5)全通濾波器:允許所有頻率的波通過、僅僅改變波的相位關系。
(6)陷波濾波器:阻止一個狹窄頻率範圍通過的特殊帶阻濾波器。
2.模糊與銳化
通過不同的濾波器得到的圖像不同。
(1)如果我們希望的是降低噪聲,那我們需要的是将噪點除去,即需要模糊圖像。
(2)如果我們希望的是提取特征,那我們需要的是使特征明顯,即需要銳化圖像。
是以模糊與銳化是圖像經過濾波操作後的效果。
(1)如果經過低通濾波,更容易降低噪點,即效果是模糊效果。
(2)如果經過高通濾波,更容易顯示特征,即效果是銳化效果。
三、OpenCV中的線型濾波操作
1、方框濾波——boxblur函數
1.API
void boxFilter(
InputArray src,
OutputArray dst,
int ddepth,
Size ksize,
Point anchor=Point(-1,-1),
boolnormalize=true,
int borderType=BORDER_DEFAULT
);
函數參數含義如下:
(1)InputArray類型的src,輸入圖像。該函數對通道是獨立處理的,且可以處理任意通道數的圖檔,但需要注意,待處理的圖檔深度應該為CV_8U, CV_16U, CV_16S, CV_32F 以及 CV_64F之一。
(2)OutputArray類型的dst,即目标圖像,與輸入圖像有相同的尺寸和類型。
(3)int類型的ddepth,輸出圖像的深度,-1代表使用原圖深度,即src.depth()。
(4)Size類型(對Size類型稍後有講解)的ksize,核心的大小。一般這樣寫Size( w,h )來表示核心的大小( 其中,w 為像素寬度, h為像素高度)。Size(3,3)就表示3x3的核大小,Size(5,5)就表示5x5的核大小
(5)Point類型的anchor,表示錨點(即被平滑的那個點),注意他有預設值Point(-1,-1)。如果這個點坐标是負值的話,就表示取核的中心為錨點,是以預設值Point(-1,-1)表示這個錨點在核的中心。
(6)bool類型的normalize,預設值為true,一個辨別符,表示核心是否被其區域歸一化(normalized)了。
(7)int類型的borderType,用于推斷圖像外部像素的某種邊界模式。有預設值BORDER_DEFAULT。
2.代碼展示
#include<opencv2\opencv.hpp>
#include<iostream>
using namespace std;
using namespace cv;
int main()
{
Mat src, dst;
src = imread("E:/image/Girl2.png");
if (!src.data)
{
cout << "could not load image !";
return -1;
}
imshow("src", src);
//方框濾波
boxFilter(src, dst, -1, Size(5, 5));
imshow("boxFilter_src", dst);
waitKey(0);
return 0;
}
3.執行結果
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiI0gTMx81dsQWZ4lmZf1GLlpXazVmcvwFciV2dsQXYtJ3bm9CX9s2RkBnVHFmb1clWvB3MaVnRtp1XlBXe0xCMy81dvRWYoNHLwEzX5xCMx8FesU2cfdGLwMzX0xiRGZkRGZ0Xy9GbvNGLpZTY1EmMZVDUSFTU4VFRR9Fd4VGdsYTMfVmepNHLrJXYtJXZ0F2dvwVZnFWbp1zczV2YvJHctM3cv1Ce-cmbw5SMzMDOyEzMiRWZkdzNmdTMzYzX5IDN0kDM3AzLclDMyIDMy8CXn9Gbi9CXzV2Zh1WavwVbvNmLvR3YxUjLyM3Lc9CX6MHc0RHaiojIsJye.png)
原圖
經過方框濾波模糊後的圖像
2、均值濾波——blur函數
1.API
void blur(
InputArray src,
OutputArray dst,
Size ksize,
Point anchor=Point(-1,-1),
int borderType=BORDER_DEFAULT
);
函數參數含義如下:
(1)InputArray類型的src,輸入圖像。該函數對通道是獨立處理的,且可以處理任意通道數的圖檔,但需要注意,待處理的圖檔深度應該為CV_8U, CV_16U, CV_16S, CV_32F 以及 CV_64F之一。
(2)OutputArray類型的dst,即目标圖像,與輸入圖像有相同的尺寸和類型。
(3)Size類型(對Size類型稍後有講解)的ksize,核心的大小。一般這樣寫Size( w,h )來表示核心的大小( 其中,w 為像素寬度, h為像素高度)。Size(3,3)就表示3x3的核大小,Size(5,5)就表示5x5的核大小
(4)Point類型的anchor,表示錨點(即被平滑的那個點),注意他有預設值Point(-1,-1)。如果這個點坐标是負值的話,就表示取核的中心為錨點,是以預設值Point(-1,-1)表示這個錨點在核的中心。
(5)int類型的borderType,用于推斷圖像外部像素的某種邊界模式。有預設值BORDER_DEFAULT。
2.代碼展示
#include<opencv2\opencv.hpp>
#include<iostream>
using namespace std;
using namespace cv;
int main()
{
Mat src, dst;
src = imread("E:/image/Girl2.png");
if (!src.data)
{
cout << "could not load image !";
return -1;
}
imshow("src", src);
//均值濾波
blur(src, dst, Size(3, 3), Point(-1, -1));
imshow("blur_src", dst);
waitKey(0);
return 0;
}
3.執行結果
經過均值濾波模糊後的圖像
3、高斯濾波——GaussianBlur函數
1.API
void GaussianBlur(
InputArray src,
OutputArray dst,
Size ksize,
double sigmaX,
double sigmaY=0,
intborderType=BORDER_DEFAULT
);
函數參數含義如下:
(1)InputArray類型的src,輸入圖像。該函數對通道是獨立處理的,且可以處理任意通道數的圖檔,但需要注意,待處理的圖檔深度應該為CV_8U, CV_16U, CV_16S, CV_32F 以及 CV_64F之一。
(2)OutputArray類型的dst,即目标圖像,與輸入圖像有相同的尺寸和類型。
(3)Size類型(對Size類型稍後有講解)的ksize,核心的大小。一般這樣寫Size( w,h )來表示核心的大小( 其中,w 為像素寬度, h為像素高度)。Size(3,3)就表示3x3的核大小,Size(5,5)就表示5x5的核大小
(4)double類型的sigmaX,表示高斯核函數在X方向的的标準偏差。
(5)double類型的sigmaY,表示高斯核函數在Y方向的的标準偏差。若sigmaY為零,就将它設為sigmaX,如果sigmaX和sigmaY都是0,那麼就由ksize.width和ksize.height計算出來。
(6)int類型的borderType,用于推斷圖像外部像素的某種邊界模式。有預設值BORDER_DEFAULT。
2.代碼展示
#include<opencv2\opencv.hpp>
#include<iostream>
using namespace std;
using namespace cv;
int main()
{
Mat src, dst;
src = imread("E:/image/Girl2.png");
if (!src.data)
{
cout << "could not load image !";
return -1;
}
imshow("src", src);
//高斯濾波
GaussianBlur(src, dst, Size(3, 3), 0, 0);
imshow("GaussianBlur_src", dst);
waitKey(0);
return 0;
}