在“閾值分割”中分割的結(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的腐蝕操作記為:

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 的膨脹操作記為:

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)算, 即

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

它具有填充白色物體內(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é)果, 即

用處:
- 可以得到原圖中灰度較亮的區(qū)域, 所以又稱白頂帽變換。
- 校正不均勻光照。
7.4.2、底帽變換
底帽變換的定義是圖像減去閉運(yùn)算結(jié)果, 即

用處:
- 可以得到原圖中灰度較暗的區(qū)域, 所以又稱黑底帽變換。
7.4.3、形態(tài)學(xué)梯度

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