天天看點

OpenCV3.0形态學OpenCV3.0形态學

OpenCV3.0形态學

基本的形态學變化包括膨脹(dilation)和腐蝕(erosion)。膨脹與腐蝕能實作多種多樣的功能,主要有:

  • 去除噪聲
  • 分割出圖像當中的獨立元素,在圖像中連接配接相鄰的元素
  • 尋找圖像中明顯的極大值區域和極小值區域
  • 求出圖像的梯度

腐蝕和膨脹

膨脹(Dilation)是指将一些圖像或者圖像當中的一部分區域(稱之為A)與核(稱之為B)進行卷積。核可以是任何的形狀或者大小,它有一個單獨定義出來的參考點(anchor point)。多數情況下,核是一個小的中間帶有參考點的實心正方形或者圓盤,可以将它看做是模闆或者掩碼。膨脹是求局部最大值的操作,如下圖所示,核B與圖像卷積,計算B覆寫區域像素點的最大值,并且把這個最大值指派給參考點指定的像素。達成的效果就是圖像當中的高亮區域逐漸增長。

OpenCV3.0形态學OpenCV3.0形态學

腐蝕是膨脹的反操作。腐蝕操作主要是計算核區域像素的最小值,如下圖所示,腐蝕的過程是:當B與圖像卷積時,計算被B覆寫的區域的最小像素值,并且把這個值放置到參考點上面。

OpenCV3.0形态學OpenCV3.0形态學

形态學腐蝕膨脹的公式如下:

erode(x,y)=min(x′,y′)∈kernelsrc(x+x′,y+y′)

dilate(x,y)=max(x′,y′)∈kernelsrc(x+x′,y+y′)

一般來講,膨脹擴充了區域A,而腐蝕縮小了區域A。此外,膨脹可以填補凹洞,腐蝕能夠消除細小的凸起。準确的效果取決于核的選取,不過以上的效果能夠在選取凸核時很好地實作。下面我們使用OpenCV3.0.0調用erode和dilate兩個函數,完成腐蝕和膨脹的實作。

OpenCV3.0形态學OpenCV3.0形态學

OpenCV3.0提供了erode和dilate方法,實作形态學的腐蝕和膨脹。

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

erode方法的參數主要是前面三個需要設定,前兩個src是輸入的原始圖像,第二個dst是腐蝕操作的結果。關鍵參數是kernel,為了個性定制想要的kernel,我們可以使用下面的函數完成:

Mat getStructuringElement(int shape, Size ksize, Point anchor = Point(-1,-1));
           

該函數第一個參數是shape,表示生成的形狀屬于何種,如下所示:

enum MorphShapes {
MORPH_RECT    = 0, //方形
MORPH_CROSS   = 1, //十字形
MORPH_ELLIPSE = 2 //橢圓形
};
           

膨脹方法:

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

本文使用的kernel為3*3的十字形,參考點設定為預設的中心位置。腐蝕和膨脹得到的結果分别如下圖:

OpenCV3.0形态學OpenCV3.0形态學
OpenCV3.0形态學OpenCV3.0形态學
OpenCV3.0形态學OpenCV3.0形态學

進階形态學處理方法

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

該方法其中的int型op參數定義了不同的操作類型,如下:

enum MorphTypes{
MORPH_ERODE    = 0, //腐蝕
MORPH_DILATE   = 1, //膨脹
MORPH_OPEN     = 2, //形态學開運算
MORPH_CLOSE    = 3, //形态學閉運算
MORPH_GRADIENT = 4, //形态學梯度
MORPH_TOPHAT   = 5, //禮帽運算
MORPH_BLACKHAT = 6  //黑帽運算        
};
           

開運算(Opening Operation)

開運算是先腐蝕再膨脹的過程,作用是消除小物體、在纖細處分離物體、平滑較大物體的邊界、斷開目标物之間的粘連同時并不明顯改變目标物的面積。開運算經常用于統計二值圖像中的區域數。例如,拍攝到一張顯微鏡下面的細胞圖檔,并且對該圖檔進行了門檻值化的處理,可以使用開運算将相鄰的細胞區分開來,然後再計算圖像中的區域(細胞)數目。

OpenCV3.0形态學OpenCV3.0形态學
OpenCV3.0形态學OpenCV3.0形态學
OpenCV3.0形态學OpenCV3.0形态學

閉運算(Closing Operation)

閉運算是先膨脹,後腐蝕的過程。作用是能夠去掉小型的低灰階值區域,也就是“填平”的作用。

OpenCV3.0形态學OpenCV3.0形态學
OpenCV3.0形态學OpenCV3.0形态學
OpenCV3.0形态學OpenCV3.0形态學

形态學梯度(Morphological Gradient)

形态學梯度為膨脹圖與腐蝕圖之差,計算公式如下:

gradient(src)=dilate(src)−erode(src)

對二值圖像進行該操作能夠将團塊(Blob)的邊緣突出出來。我們可以用形态學梯度來保留物體的邊緣輪廓。下圖解釋了這一操作的過程:形态梯度在灰階圖像應用,在灰階值變化最劇烈的區域得到的結果數值最大。右下圖是操作結果,圖像的邊緣以高亮區域突出。

OpenCV3.0形态學OpenCV3.0形态學

禮帽(Top Hat)

禮帽操作是從A減去A的開運算,計算公式為

TopHat(src)=src−open(src)

OpenCV3.0形态學OpenCV3.0形态學
OpenCV3.0形态學OpenCV3.0形态學
OpenCV3.0形态學OpenCV3.0形态學

因為開運算帶來的結果是放大了裂縫或者是局部低亮度區域,是以,從原圖中減去開運算後的圖像,得到的效果突出了比原圖輪廓周圍區域更亮明亮的區域,并且這一操作和選擇的核的大小相關。上圖參與計算的核大小為3*3的MORPH_CROSS類型。禮帽運算往往用來分離比臨近點亮一些的斑塊。當微小目标有規律的情況下,可以使用禮帽運算進行背景提取。

黑帽(Black hat)

黑帽運算是閉運算的結果與原圖像之差。計算公式為:

BlackHat(src)=close(src)−src

黑帽運算後的效果突出了比原圖輪廓周圍區域更暗的區域,且這一操作和選擇的核大小相關。是以,黑帽運算用于分離比鄰近點暗一些的區域。

OpenCV3.0形态學OpenCV3.0形态學
OpenCV3.0形态學OpenCV3.0形态學
OpenCV3.0形态學OpenCV3.0形态學

[TOC]

來生成目錄:

  • OpenCV30形态學
    • 腐蝕和膨脹
    • 進階形态學處理方法
      • 開運算Opening Operation
      • 閉運算Closing Operation
      • 形态學梯度Morphological Gradient
      • 禮帽Top Hat
      • 黑帽Black hat