OpenCV C++(七)----形態(tài)學(xué)處理

在“閾值分割”中分割的結(jié)果經(jīng)常包含一些干擾,有的甚至影響了目標(biāo)物體的形狀。數(shù)學(xué)形態(tài)學(xué)提供了一組有用的方法,能夠用來調(diào)整分割區(qū)域的形狀以獲得比較理想的結(jié)果。常用的形態(tài)學(xué)處理方法包括: 腐蝕、膨脹、開運(yùn)算、閉運(yùn)算、頂帽運(yùn)算、底帽運(yùn)算,其中腐蝕和膨脹是最基礎(chǔ)的方法,其他方法是兩者相互組合而產(chǎn)生的 。

7.1、腐蝕

圖像的腐蝕操作與中值平滑操作類似,它是取每一個(gè)位置的矩形鄰域內(nèi)值的最小值作為該位置的輸出灰度值。

不同的是,這里的鄰域不再單純是矩形結(jié)構(gòu)的,也可以是橢圓形結(jié)構(gòu)的、十字交叉形結(jié)構(gòu)的等, 它在大多數(shù)書中的定義是結(jié)構(gòu)元,只是用來指明鄰域結(jié)構(gòu)的形狀,與卷積核類似,它同樣需要指定一 個(gè)錨點(diǎn)。

腐蝕后輸出圖像的總體亮度的平均值比起原圖會(huì)有所降低,圖像中比較亮的區(qū)域的面積會(huì)變小甚至消失,而比較暗的區(qū)域的面積會(huì)增大。

圖像I與結(jié)構(gòu)元S的腐蝕操作記為:

image.png
void erode( InputArray src, OutputArray dst, InputArray kernel,
                         Point anchor = Point(-1,-1), int iterations = 1,
                         int borderType = BORDER_CONSTANT,
                         const Scalar& borderValue = morphologyDefaultBorderValue() );

    Mat img = imread("Koala.jpg", IMREAD_GRAYSCALE);
    //創(chuàng)建矩形結(jié)構(gòu)元
    Mat s = getStructuringElement(MORPH_RECT, Size(3, 3));
    //2次腐蝕操作
    Mat ErodeImg;
    erode(img, ErodeImg, s, Point(-1, -1), 2);

隨著結(jié)構(gòu)元尺寸的增大,灰度較暗的區(qū)域的面積也隨著增大,同時(shí)灰度較亮的區(qū)域的面積就隨著減小了,而且處理后的效果可以隱約看出結(jié)構(gòu)元的形狀,即很多重疊的矩形塊,很像馬賽克效果。當(dāng)然,如果采用橢圓形或者十字交叉形的結(jié)構(gòu)元進(jìn)行腐蝕,則同樣會(huì)出現(xiàn)類似的橢圓或者十字交叉的形狀。

7.2、膨脹

膨脹是取每一個(gè)位置鄰域內(nèi)的最大值,膨脹后的輸出圖像的總體亮度的平均值比起原圖會(huì)有所上升,而圖像中較亮物體的尺寸會(huì)變大;相反,較暗物體的尺寸會(huì)減小,甚至消失。

圖像I 和結(jié)構(gòu)元S 的膨脹操作記為:

image.png
void dilate( InputArray src, OutputArray dst, InputArray kernel,
                          Point anchor = Point(-1,-1), int iterations = 1,
                          int borderType = BORDER_CONSTANT,
                          const Scalar& borderValue = morphologyDefaultBorderValue() );

7.3、開運(yùn)算和閉運(yùn)算

7.3.1、開運(yùn)算

先腐蝕后膨脹的過程稱為開運(yùn)算, 即

image.png

它具有消除亮度較高的細(xì)小區(qū)域、在纖細(xì)點(diǎn)處分離物體, 對(duì)于較大物體,可以在不明顯改變其面積的情況下平滑其邊界等作用。

7.3.2、閉運(yùn)算

先膨脹后腐蝕, 即

image.png

它具有填充白色物體內(nèi)細(xì)小黑色空洞的區(qū)域、連接臨近物體、同一個(gè)結(jié)構(gòu)元、多次迭代處理,也可以在不明顯改變其面積的情況下平滑其邊界等作用。

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() );

op的值如下

enum MorphTypes{
    MORPH_ERODE    = 0, //!< see #erode
    MORPH_DILATE   = 1, //!< see #dilate
    MORPH_OPEN     = 2, //!< an opening operation
                        //!< \f[\texttt{dst} = \mathrm{open} ( \texttt{src} , \texttt{element} )= \mathrm{dilate} ( \mathrm{erode} ( \texttt{src} , \texttt{element} ))\f]
    MORPH_CLOSE    = 3, //!< a closing operation
                        //!< \f[\texttt{dst} = \mathrm{close} ( \texttt{src} , \texttt{element} )= \mathrm{erode} ( \mathrm{dilate} ( \texttt{src} , \texttt{element} ))\f]
    MORPH_GRADIENT = 4, //!< a morphological gradient
                        //!< \f[\texttt{dst} = \mathrm{morph\_grad} ( \texttt{src} , \texttt{element} )= \mathrm{dilate} ( \texttt{src} , \texttt{element} )- \mathrm{erode} ( \texttt{src} , \texttt{element} )\f]
    MORPH_TOPHAT   = 5, //!< "top hat"
                        //!< \f[\texttt{dst} = \mathrm{tophat} ( \texttt{src} , \texttt{element} )= \texttt{src} - \mathrm{open} ( \texttt{src} , \texttt{element} )\f]
    MORPH_BLACKHAT = 6, //!< "black hat"
                        //!< \f[\texttt{dst} = \mathrm{blackhat} ( \texttt{src} , \texttt{element} )= \mathrm{close} ( \texttt{src} , \texttt{element} )- \texttt{src}\f]
    MORPH_HITMISS  = 7  //!< "hit or miss"
                        //!<   .- Only supported for CV_8UC1 binary images. A tutorial can be found in the documentation
};

7.4、其他形態(tài)學(xué)處理操作

7.4.1、頂帽變換

頂帽變換的定義是圖像減去開運(yùn)算結(jié)果, 即

image.png

用處:

  • 可以得到原圖中灰度較亮的區(qū)域, 所以又稱白頂帽變換。
  • 校正不均勻光照。

7.4.2、底帽變換

底帽變換的定義是圖像減去閉運(yùn)算結(jié)果, 即

image.png

用處:

  • 可以得到原圖中灰度較暗的區(qū)域, 所以又稱黑底帽變換。

7.4.3、形態(tài)學(xué)梯度

image.png

即膨脹結(jié)果減去腐蝕結(jié)果,得到的便是圖像中物體的邊界。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容