opencv中的開運算,閉運算,形態學梯度,頂帽和黑帽簡介
阿新 • • 發佈:2018-11-08
開運算 = 先腐蝕運算,再膨脹運算(看上去把細微連在一起的兩塊目標分開了)
開運算的效果圖如下圖所示:
(1)開運算能夠除去孤立的小點,毛刺和小橋,而總的位置和形狀不便。
(2)開運算是一個基於幾何運算的濾波器。
(3)結構元素大小的不同將導致濾波效果的不同。
(4)不同的結構元素的選擇導致了不同的分割,即提取出不同的特徵。
- 2.閉運算
閉運算 = 先膨脹運算,再腐蝕運算(看上去將兩個細微連線的圖塊封閉在一起)
閉運算的效果圖如下圖所示:
- 閉運算總結:
(1)閉運算能夠填平小湖(即小孔),彌合小裂縫,而總的位置和形狀不變。
(2)閉運算是通過填充影象的凹角來濾波影象的。
(3)結構元素大小的不同將導致濾波效果的不同。
(4)不同結構元素的選擇導致了不同的分割。
我們可以使用opencv自帶函式進行除錯哦!
openCV裡有一個很好的函式getStructuringElement,我們只要往這個函式傳相應的處理引數,就可以進行相應的操作了,使用起來非常方便。下面我簡單列舉一下相應的操作巨集定義:
識別符號 | 含義 |
---|---|
MORPH_OPEN | 開運算 |
MORPH_CLOSE | 閉運算 |
MORPH_ERODE | 腐蝕 |
MORPH_DILATE | 膨脹 |
我就簡單舉個例子:
#include<opencv2\opencv.hpp>
#include<opencv2\highgui\highgui.hpp>
using namespace std;
using namespace cv;
int main()
{
Mat img = imread("寒山不冷.jpg");
namedWindow("原始圖", WINDOW_NORMAL);
imshow("原始圖", img);
Mat out;
//獲取自定義核 第一個引數MORPH_RECT表示矩形的卷積核,當然還可以選擇橢圓形的、交叉型的
Mat element = getStructuringElement(MORPH_RECT, Size(18, 18));
//具體要選擇哪種操作,就修改第三個引數就可以了。這裡演示的是形態學開運算處理
morphologyEx(img, out, MORPH_OPEN, element);
namedWindow("形態學處理操作", WINDOW_NORMAL);
imshow("形態學處理操作", out);
waitKey(0);
}
開運算:先腐蝕,再膨脹
可以清除一些小東西(亮的),放大區域性低亮度的區域
閉運算:先膨脹,再腐蝕
可以清除小黑點
形態學梯度:膨脹圖與腐蝕圖之差
提取物體邊緣
頂帽:原影象 - 開運算圖
突出原影象中比周圍亮的區域
黑帽:閉運算圖 - 原影象
突出原影象中比周圍暗的區域
這些運算都能用一個函式進行處理
void morphologyEx(InputArray src, OutputArray dst, int op, InputArray kernel, ...)
看前四個引數就行了,後面的就用預設值
第一個引數 輸入
第二個引數 輸出
第三個引數 操作型別
MORTH_OPEN 函式做開運算
MORTH_CLOSE 函式做閉運算
MORTH_GRADIENT 函式做形態學梯度運算
MORTH_TOPHAT 函式做頂帽運算
MORTH_BLACKHAT 函式做黑帽運算
MORTH_DILATE 函式做膨脹運算
MORTH_ERODE 函式做腐蝕運算
第四個引數 核心型別 用getStructuringElement函式得到
例子:
morphologyEx(ma1, maArray[0], MORPH_OPEN, getStructuringElement(MORPH_RECT, Size(15,15))); imshow("im4", maArray[0]);
morphologyEx(ma1, maArray[1], MORPH_CLOSE, getStructuringElement(MORPH_RECT, Size(15, 15))); imshow("im5", maArray[1]); morphologyEx(ma1, maArray[2], MORPH_GRADIENT, getStructuringElement(MORPH_RECT, Size(15, 15))); imshow("im6", maArray[2]); morphologyEx(ma1, maArray[3], MORPH_TOPHAT, getStructuringElement(MORPH_RECT, Size(15, 15))); imshow("im7", maArray[3]); morphologyEx(ma1, maArray[4], MORPH_BLACKHAT, getStructuringElement(MORPH_RECT, Size(15, 15))); imshow("im8", maArray[4]); morphologyEx(ma1, maArray[5], MORPH_DILATE, getStructuringElement(MORPH_RECT, Size(15, 15))); imshow("im9", maArray[5]); morphologyEx(ma1, maArray[6], MORPH_ERODE, getStructuringElement(MORPH_RECT, Size(15, 15))); imshow("im10", maArray[6]);</code></pre>