1. 影像的摺積
1.1 摺積
摺積 是一種數學運算,它將兩個函式(或矩陣)結合起來,生成一個第三個函式。在影像處理中,摺積通常用於將一個 濾波器 與影像進行運算。
影像的 濾波器 是一種用於 增強或抑制影像中特定特征 的工具。它通常是一個小矩陣,定義了如何對影像中的像素進行操作。
摺積在影像處理中有很多套用,包括影像平滑、影像銳化、邊緣檢測和影像分割。
1.2 摺積的原理
在泛函分析中, 摺積 (convolution),或譯為 疊積 、 褶積 或 旋積 ,是透過兩個函式 f 和 g 生成第三個函式的一種數學算子,表征函式 f 與經過翻轉和平移的 g 的乘積函式所圍成的曲邊梯形的面積。
摺積可分為一維摺積、二維摺積、三維摺積和多維摺積等。
1.2.1 一維摺積
一維摺積在數學上的定義: f 和 g 是實數 R 上的兩個可積函式,我們稱 (f*g)(n) 為 f、g 的摺積。
其連續的定義為:
其離散的定義為:
1.2.2 二維摺積
在影像處理中,我們常用的是二維摺積。其原理是將一個稱為 摺積核 (濾波器)的矩陣與影像進行 滑動運算 ,從而得到一個新的影像。
滑動運算 是指將摺積核在影像上逐個像素移動,並對每個位置進行摺積操作。
在影像的二維摺積中,如果把影像矩陣簡寫為 I 把摺積核 Kernal 簡寫為 K,則目標影像的第 (i,j) 個像素的摺積值為:
其中,I 是一個二維矩陣,K 是一個大小為 mxn 的摺積核。基於摺積的可交換性,可以把上述公式改成:
與之類似的還有 互相關函式 (corresponding function):
它在很多影像處理庫和深度學習庫中,經常會用到。
上圖實質上是 二維單鍊結 的摺積,對於 二維多通道 的摺積如下圖所示,將每個摺積核套用到每一個通道上。
然後將每個通道處理後的每個加在一起以形成單個輸出通道。
1.2.3 三維摺積
三維摺積是摺積在三維空間上的推廣。它將一個三維的濾波器與一個三維的輸入數據進行摺積運算,得到一個三維的輸出數據,以提取三維數據中的特征。主流的深度學習框架,都提供了三維摺積的實作。
1.3 摺積的性質
摺積具有交換律、結合律、分配律,以二維摺積為例它具有以下的性質:
交換律 :f(x, y) * g(x, y) = g(x, y) * f(x, y)
結合律 :(f(x, y) * g(x, y))* h(x, y) = f(x, y) * (g(x, y) * h(x, y))
分配律 :f(x, y) * (g(x, y) + h(x, y)) = f(x, y) * g(x, y) + f(x, y) * h(x, y)
2. 影像濾波
2.1 影像濾波
影像濾波 是一種影像處理技術,用於增強或抑制影像中的特定特征,它可以看作是摺積的一種特殊情況。影像濾波可以用影像摺積來實作,但是影像摺積不一定是影像濾波。
在 OpenCV 中,提供了豐富的影像濾波函式,可以滿足各種影像處理需求。常用影像濾波函式包括:
均值濾波:
blur()
、
boxFilter()
高斯濾波:
GaussianBlur()
中值濾波:
medianBlur()
雙邊濾波:
bilateralFilter()
非線性濾波:
fastNlMeansDenoising()
邊緣檢測濾波:
Sobel()
、
Scharr()
、
Laplacian()
形態學濾波:
erode()
、
dilate()
、
morphologyEx()
頻域濾波:
dft()
、
idft()
下面的例子,分別展示了原圖經過均值濾波、高斯濾波、中值濾波和雙邊濾波之後的效果圖。特別是雙邊濾波,對原圖中的美女進行了美顏和磨皮。
#include<opencv2/opencv.hpp>
#include<opencv2/core.hpp>
#include<opencv2/highgui.hpp>
#include<opencv2/imgproc.hpp>
usingnamespacestd;
usingnamespace cv;
intmain(){
Mat src = imread(".../girl.jpg");
// 均值濾波
Mat blurred_image;
blur(src, blurred_image, Size(15, 15));
// 高斯濾波
Mat gaussian_blurred_image;
GaussianBlur(src,gaussian_blurred_image, Size(15, 15), 0);
// 中值濾波
Mat median_blurred_image;
medianBlur(src, median_blurred_image,15);
// 雙邊濾波
Mat bilateral_filtered_image;
bilateralFilter(src, bilateral_filtered_image,15, 80, 80);
imshow("Original Image", src);
imshow("Blurred Image", blurred_image);
imshow("Gaussian Blurred Image", gaussian_blurred_image);
imshow("Median Blurred Image", median_blurred_image);
imshow("Bilateral Filtered Image", bilateral_filtered_image);
waitKey(0);
return0;
}
OpenCV 還提供了自訂的濾波器
filter2D()
函式,在該系列的第九篇文章中,曾經介紹過
filter2D()
函式。
下面的例子,展示了使用
filter2D()
函式對影像進行模糊和銳化。
#include<opencv2/opencv.hpp>
#include<opencv2/core.hpp>
#include<opencv2/highgui.hpp>
#include<opencv2/imgproc.hpp>
usingnamespacestd;
usingnamespace cv;
intmain(){
Mat src = imread(".../girl.jpg");
imshow("src", src);
Mat blurred_image,sharpen_image;
Mat kernel1 = Mat::ones(5, 5, CV_32F) / (float)(25);
Mat kernel2 = (Mat_<char>(3, 3) << 0, -1, 0, -1, 5, -1, 0, -1, 0);
filter2D(src, blurred_image, -1, kernel1);
filter2D(src, sharpen_image, -1, kernel2);
imshow("Blurred Image", blurred_image);
imshow("Sharpen Image", sharpen_image);
waitKey(0);
return0;
}
下面簡單解釋一下
filter2D()
函式:
voidfilter2D( InputArray src, OutputArray dst, int ddepth,
InputArray kernel, Point anchor = Point(-1,-1),
double delta = 0, int borderType = BORDER_DEFAULT );
第三個參數 ddepth: 輸出影像的深度。當 ddepth 輸入值為 -1 時,目標影像和原影像深度保持一致。
第四個參數 kernel: 摺積核。
第五個參數 anchor: 摺積核的錨點。
第六個參數 delta: 摺積結果與原影像相加的值。
第七個參數 borderType: 邊界處理方式。
2.2 影像濾波的分類
根據濾波器在影像域和頻域的操作方式,影像濾波可以分為空間域濾波和頻域濾波。
2.2.1 空間域濾波
空間域濾波直接對影像中的像素進行操作,根據濾波器與影像像素之間的空間關系來計算輸出像素的值。空間域濾波的計算量通常較小,但濾波效果往往比較局限。
空間域濾波按濾波器的線性特性又可分為:
線性濾波 :濾波器輸出與輸入之間呈線性關系。
常用的線性濾波器包括:
a 均值濾波:用於去除影像雜訊,具有平滑影像的效果。
b 高斯濾波:具有平滑影像和邊緣保持的效果。
c 中值濾波:具有去除椒鹽雜訊和保持邊緣細節的效果。
d 拉普拉斯濾波:用於邊緣檢測。
非線性濾波 :濾波器輸出與輸入之間不呈線性關系。
常用的非線性濾波器包括:
a 中值濾波:用於去除椒鹽雜訊和保持邊緣細節。
b 雙邊濾波:具有平滑影像和保持邊緣細節的效果。
c 自適應濾波:根據影像局部特性進行濾波,具有較好的濾波效果。
2.2.2 頻域濾波
頻域濾波是將影像傅立葉變換到頻域,然後對頻譜進行濾波,最後再將頻譜逆傅立葉變換回空間域得到濾波後的影像。頻域濾波的計算量通常較大,但濾波效果往往比較靈活。
頻域濾波按濾波器的作用方式又可分為:
低通濾波 :濾除影像中的高頻成分,具有平滑影像的效果。
高通濾波 :濾除影像中的低頻成分,具有銳化影像的效果。
帶通濾波 :濾除影像中的特定頻段成分,具有增強影像紋理的效果。
3. 總結
影像摺積和影像濾波是影像處理中兩個密切相關的概念。它們都涉及到使用濾波器對影像進行操作,以獲得新的影像。
影像摺積是影像濾波的基礎,影像濾波可以透過影像摺積來實作,但影像濾波也可以使用其他方法來實作。
影像摺積和影像濾波具有廣泛的套用,透過使用不同的濾波器,可以實作各種影像處理效果。
推薦閱讀