在影像處理中,所謂的 Mask Operation(遮罩運算) 實質上就是濾波。它透過一個小型矩陣(稱為 Kernel 或 Mask)在影像上滑動,對每個像素及其鄰域進行加權運算,以實現銳化、模糊、邊緣檢測等效果。
以一個 3×3 的銳化核為例:
Mat kern = (Mat_(3,3) << 0, -1, 0, -1, 5, -1, 0, -1, 0);
Mat_ 是 OpenCV 的模板類別,用於快速建立矩陣。上述程式碼建立了一個 3×3 的有號字元矩陣(數值範圍 -128~127),中心權重為 5,四周為 -1,這是一個典型的拉普拉斯銳化核。
函數原型如下:
void filter2D(InputArray src, // 輸入影像
OutputArray dst, // 輸出影像
int ddepth, // 輸出影像深度,通常用 src.depth()
InputArray kernel, // 卷積核(第一步建立的 Mask)
Point anchor=Point(-1,-1), // 錨點,預設為核心中心
double delta=0, // 運算後額外加上的值
int borderType=BORDER_DEFAULT); // 邊界處理模式
實際呼叫範例:
filter2D(I, K, I.depth(), kern);
OpenCV 2.0 附帶的範例展示了手寫銳化函數與 filter2D 的效能比較:
Sharpen():手寫雙重迴圈實現銳化,逐像素存取,速度較慢。filter2D():呼叫優化過的底層實現,速度顯著更快。範例中使用 getTickCount() 計時,直觀展示了內建函數的效能優勢。實際開發中,優先使用內建函數,除非有極特殊的自定義需求。
Mat_ 方便快速建構小型矩陣。filter2D 是 OpenCV 提供的通用 2D 濾波函數,效能優於手寫迴圈。BORDER_DEFAULT(反射法)。