開運算:先腐蝕后膨脹。
能夠排除小亮點。
閉運算:先膨脹后腐蝕。
能夠排除小黑點。
形態學梯度:膨脹圖 — 腐蝕圖。
對二值圖像進行這一操作,可將圖塊的邊緣突出出來,故可用來保留物體邊緣輪廓。
頂帽:原圖 — 開運算結果。
可以認為是找到那些被開運算排除的小亮點。
黑帽:閉運算結果 — 原圖。
可以認為是找到那些被閉運算排除的小黑點。
為了方便,opencv 將這些操作集合到了一個函數中 morphologyEx。要實現不同操作,僅需改變其第三個成員變量 形態學運算標識符。
形態學濾波:morphologyEx 函數
void morphologyEx(InputArray src, OutputArray dst, int op, InputArray kernel, Point anchor = Point(-1, -1), int iterations = 1, int borderType = BORDER_CONSTANT, const Scalar& borderValue = morphologyDefaultBorderValue());
- src,輸入圖像,即原圖像,填 Mat 類的對象即可。
- dst,目標圖像,需要和原圖片有一樣的尺寸和類型。
- op,形態學運算的類型。
MORPH_ERODE = 0, //腐蝕
MORPH_DILATE = 1, //膨脹
MORPH_OPEN = 2, //開操作
MORPH_CLOSE = 3, //閉操作
MORPH_GRADIENT = 4, //梯度操作
MORPH_TOPHAT = 5, //頂帽操作
MORPH_BLACKHAT = 6, //黑帽操作
- kernel,膨脹操作的核。當為 NULL 時,表示的是使用參考點位於中心,大小 3×3 的核。
一般用函數 getStructuringElement 配合這個參數使用。
例如:Mat kernel = getStructuringElement(MORPH_RECT, Size(3, 3));
Mat getStructuringElement(int shape, Size ksize, Point anchor = Point(-1, -1));
-
- shape,矩形:MORPH_RECT
交叉形:MORPH_CROSS
橢圓形:MORPH_ELLIPSE
-
- ksize,內核的尺寸。
- anchor,錨點的位置,默認位於中心。
- anchor,錨點的位置,默認位於中心。
- iterations 迭代使用 dilate() 的次數,默認值為 1。
- borderType,邊界拓展的方法。
- borderValue,當邊界為常數時的邊界值,有默認值,一般不用管。