前言
簡單的來講掐隐,形態(tài)學操作是基于形狀的圖像處理操作蓄喇,通過將結(jié)構(gòu)元素作用于輸入圖像來輸出圖像造烁。
對圖像形態(tài)學運算锦溪,這里有詳細的介紹参萄。
這個有什么用呢累驮?
消除噪聲
分割(isolate)獨立的圖像元素酣倾,以及連接(join)相鄰的元素。
尋找圖像中的明顯的極大值區(qū)域或極小值區(qū)域谤专。 出自《OpenCV》
形態(tài)學操作介紹
我先來分析一下接下來要做什么事情:
1.我們需要創(chuàng)建一張圖像躁锡,將多通道圖像spilt成單通道圖像。<傳多通道圖像也可以>
2.對圖形進行形態(tài)學操作毒租。
3.將多個單通道圖像Merge成多通道圖像稚铣,輸出圖像箱叁。
其實就我的理解,腐蝕就是求某個范圍的最小值,膨脹則恰恰相反惕医。
OpenCV提供兩個方法:
Erode
CVAPI(void)? cvErode( const CvArr* src, CvArr* dst,
IplConvKernel* element CV_DEFAULT(NULL),int iterations CV_DEFAULT(1));
Dilate
CVAPI(void)? cvDilate( const CvArr* src, CvArr* dst,
IplConvKernel* element CV_DEFAULT(NULL),int iterations CV_DEFAULT(1));
當然黑體標注的參數(shù)是必須要傳的參數(shù)耕漱,一個是輸入圖像,一個是輸出圖像抬伺。之間已經(jīng)說過標注CV_DEFAULT的是默認參數(shù)螟够,傳可以,不傳就加載默認值(If element pointer is NULL, 3x3 rectangular element is used峡钓,iterations default 1-??這個是我說的妓笙,黑體是文檔說的)。?
所以說我們先得研究一下這個lpIConvKernel能岩。
typedef struct _IplConvKernel {int? nCols;int? nRows;int? anchorX;int? anchorY;int *values;int? nShiftR;}IplConvKernel;
結(jié)構(gòu)體寞宫,找一下初始化方法。
CVAPI(IplConvKernel*)? cvCreateStructuringElementEx(int cols, int? rows, int? anchor_x, int? anchor_y,int shape, int* values CV_DEFAULT(NULL) );
?參數(shù):列數(shù) 拉鹃、行數(shù)辈赋、錨點
@param shape element shape that could be one of the cv::MorphShapes_c
@param values integer array of cols*rows elements that specifies the custom shape of the
structuring element, when shape=CV_SHAPE_CUSTOM.
這里說的也很明白,加載系統(tǒng)默認的Element你有三個參數(shù)可以選擇膏燕,如果自定義Element钥屈,shape 參數(shù)use CV_SHAPE_CUSTOM。
這里就已自定義的Element來Erode一下圖像坝辫,Dilate原理想同篷就,就不做解釋了。
我們創(chuàng)建一個4*4的Element來Erode這幅圖像近忙。
將滿足條件的點留下竭业,不滿足條件的點丟棄。(當前錨點所處的點是不是最小值银锻,是則留下永品,不是則拋棄)
道理是這樣,我們需要對實際圖像做處理,那為了測試結(jié)果的準確性击纬,所以做以下測試:
小結(jié)
我們可以從膨脹與腐蝕的圖像中看出來:
膨脹操作時鼎姐,將Element劃過圖像,將Element覆蓋區(qū)域的最大相素值提取,并代替錨點位置的相素更振。
腐蝕操作時炕桨,將Element劃過圖像,將Element覆蓋區(qū)域的最小相素值提取,并代替錨點位置的相素肯腕。
需要注意的是:很多文檔前景文字顏色為黑色献宫,所以這個文字粗細不能夠準確的表達膨脹與腐蝕。
更多形態(tài)學算法操作
OpenCV提供了一個可以替換Dilate实撒、Erode的函數(shù)姊途,或者可以這樣說涉瘾,OpenCV提供一個能夠做形態(tài)學變換的函數(shù),其中包含基本的Dilate捷兰、Erode操作立叛。
@param op Type of a morphological operation, see cv::MorphTypes
cvMorphologyEx(const CvArr *src, CvArr *dst, CvArr *temp, IplConvKernel *element, int operation,int iterations CV_DEFAULT(1))
這里需要注意的是第三個參數(shù),temp,需要傳一個臨時參數(shù),operation是MorphTypes的枚舉贡茅。
需要注意的是MORPH_HITMISS type參數(shù)是需要輸入一個二值圖像秘蛇。
這些操作無非就是一個套一個,好像有很多都是某個的逆運算哈顶考。