OpenCV形態學操作
形態學操作(Morphological Operations)源自二值圖像處理,主要用于分析和處理圖像中的結構元素,對圖像進行去噪、提取邊緣、分割等預處理步驟。OpenCV庫中提供了豐富的形態學函數,常見的包括:
- 膨脹(Dilation)
- 腐蝕(Erosion)
- 開操作(Opening)
- 閉操作(Closing)
- 形態學梯度(Morphological Gradient)
- 頂帽(Top Hat)
- 黑帽(Black Hat)
下面將逐一介紹這些操作的原理、用途,以及在 C++ 中的使用方法。
1. 基礎概念:結構元素(Kernel)
形態學操作的核心是“結構元素”:一個二值矩陣,用來掃描圖像并決定像素的處理方式。在 OpenCV 中,我們通常使用 getStructuringElement
來創建常見形狀的結構元素:
// 創建 5×5 的矩形結構元素
Mat kernel = getStructuringElement(MORPH_RECT, Size(5, 5));
// 創建 3×3 的橢圓結構元素
Mat kernelEllipse = getStructuringElement(MORPH_ELLIPSE, Size(3, 3));
// 創建 7×7 的交叉形結構元素
Mat kernelCross = getStructuringElement(MORPH_CROSS, Size(7, 7));
2. 膨脹(Dilation)與腐蝕(Erosion)
2.1 腐蝕(Erosion)
- 原理:用結構元素“擦除”邊緣,使前景對象變小。
- 用途:去除小噪點、斷開細小的連通區域。
Mat src = imread("input.jpg", IMREAD_GRAYSCALE);
Mat eroded;
Mat kernel = getStructuringElement(MORPH_RECT, Size(3, 3));
erode(src, eroded, kernel);
如上圖腐蝕可以把白點去除
2.2 膨脹(Dilation)
- 原理:用結構元素“擴展”邊緣,使前景對象變大。
- 用途:填補小孔洞、連接相鄰的對象。
Mat src = imread("input.jpg", IMREAD_GRAYSCALE);
Mat dilated;
Mat kernel = getStructuringElement(MORPH_RECT, Size(3, 3));
dilate(src, dilated, kernel);
如上圖膨脹會把數字A中的小黑點去除
3. 開操作(Opening)與閉操作(Closing)
對腐蝕和膨脹的組合操作
3.1 開操作(Opening)
- 定義:先腐蝕后膨脹(Erosion → Dilation)。
- 效果:去除小的光斑噪點,同時保持整體輪廓不變。
Mat opened;
morphologyEx(src, opened, MORPH_OPEN, kernel);
開操作對比腐蝕,去除白點后保證中間黑點和字母A大小不變
3.2 閉操作(Closing)
- 定義:先膨脹后腐蝕(Dilation → Erosion)。
- 效果:填補前景對象的小孔洞,同時保持整體輪廓不變。
Mat closed;
morphologyEx(src, closed, MORPH_CLOSE, kernel);
閉操作對比膨脹,其去除中間黑點同時保證外圍白點和字母A大小不變
4. 形態學梯度(Morphological Gradient)
-
定義:膨脹結果與腐蝕結果之間的差值:
G r a d i e n t = D i l a t i o n ( s r c ) ? E r o s i o n ( s r c ) Gradient=Dilation(src)?Erosion(src) Gradient=Dilation(src)?Erosion(src)
-
用途:突出獲取圖像邊緣。
Mat gradient;
morphologyEx(src, gradient, MORPH_GRADIENT, kernel);
突出圖像邊緣
5. 頂帽(Top Hat)與黑帽(Black Hat)
5.1 頂帽(Top Hat)
- 定義:原圖像與開操作結果的差值: T o p H a t = s r c ? O p e n i n g ( s r c ) TopHat=src?Opening(src) TopHat=src?Opening(src)
- 用途:提取比背景亮的細小區域(小光斑)。
Mat tophat;
morphologyEx(src, tophat, MORPH_TOPHAT, kernel);
突出背景亮點
5.2 黑帽(Black Hat)
- 定義:閉操作結果與原圖像的差值: B l a c k H a t = C l o s i n g ( s r c ) ? s r c BlackHat=Closing(src)?src BlackHat=Closing(src)?src
- 用途:提取比背景暗的細小區域(小暗點)。
Mat blackhat;
morphologyEx(src, blackhat, MORPH_BLACKHAT, kernel);
突出中間黑點區域
6. 小結
- 腐蝕 / 膨脹:最基本的形態學操作,用于縮小或擴展前景區域。
- 開 / 閉操作:腐蝕與膨脹的組合,開操作用于去除小噪點,閉操作用于填補小孔洞。
- 形態學梯度:用于提取邊緣信息。
- 頂帽 / 黑帽:分別用于突出小的亮區域與暗區域。
掌握這些形態學操作后配合掩膜,你可以在圖像預處理、特征提取、目標分割等任務中如虎添翼。