形態(tài)學圖像處理(一):膨脹與腐蝕

【OpenCV入門教程之十】 形態(tài)學圖像處理(一):膨脹與腐蝕

一向族、理論與概念講解——從現(xiàn)象到本質(zhì)

形態(tài)學(morphology)一詞通常表示生物學的一個分支,該分支主要研究動植物的形態(tài)和結(jié)構(gòu)狸剃。而我們圖像處理中指的形態(tài)學怯屉,往往表示的是數(shù)學形態(tài)學抛猫。

數(shù)學形態(tài)學(Mathematical morphology) 是一門建立在格論和拓撲學基礎之上的圖像分析學科贼陶,是數(shù)學形態(tài)學圖像處理的基本理論刃泡。

其基本的運算包括:二值腐蝕和膨脹、二值開閉運算碉怔、骨架抽取烘贴、極限腐蝕、擊中擊不中變換撮胧、形態(tài)學梯度桨踪、Top-hat變換、顆粒分析芹啥、流域變換锻离、灰值腐蝕和膨脹、灰值開閉運算墓怀、灰值形態(tài)學梯度等汽纠。

最基本的形態(tài)學操作有二種:膨脹與腐蝕(Dilation與Erosion)。膨脹與腐蝕能實現(xiàn)多種多樣的功能捺疼,主要如下:

  • 消除噪聲
  • 分割(isolate)出獨立的圖像元素疏虫,在圖像中連接(join)相鄰的元素。
  • 尋找圖像中的明顯的極大值區(qū)域或極小值區(qū)域
  • 求出圖像的梯度

在進行腐蝕和膨脹的講解之前啤呼,首先需要注意,腐蝕和膨脹是對白色部分(高亮部分)而言的呢袱,不是黑色部分官扣。膨脹就是圖像中的高亮部分進行膨脹,“領域擴張”羞福,效果圖擁有比原圖更大的高亮區(qū)域惕蹄。腐蝕就是原圖中的高亮部分被腐蝕,“領域被蠶食”,效果圖擁有比原圖更小的高亮區(qū)域卖陵。

1.1 結(jié)構(gòu)元和腐蝕

1.2 膨脹

按數(shù)學方面來說遭顶,膨脹或者腐蝕操作就是將圖像(或圖像的一部分區(qū)域,我們稱之為A)與核(我們稱之為B)進行卷積泪蔫。核可以是任何的形狀和大小棒旗,它擁有一個單獨定義出來的參考點,我們稱其為錨點(anchorpoint)撩荣。多數(shù)情況下铣揉,核是一個小的中間帶有參考點和實心正方形或者圓盤,其實餐曹,我們可以把核視為模板或者掩碼逛拱。

而膨脹就是求局部最大值的操作,核B與圖形卷積台猴,即計算核B覆蓋的區(qū)域(體現(xiàn)局部)的像素點的最大值朽合,并把這個最大值賦值給參考點指定的像素。這樣就會使圖像中的高亮區(qū)域逐漸增長饱狂。


注意:其實右圖要比左圖大了一圈

膨脹可以理解為B的中心(錨點)沿著A的外邊界走了一圈旁舰。膨脹是對高亮部分而言,A區(qū)域之外的部分 < A的高亮像素嗡官,所里外面被里面取代箭窜。

效果圖,高亮部分膨脹


膨脹的數(shù)學表達式:

(x, y)周邊區(qū)域(x+x', y+y')內(nèi)的最大值代替(x, y)的值衍腥。

1.3 腐蝕

腐蝕與膨脹是相反的操作磺樱,腐蝕是求局部最小值。

可與膨脹對比理解婆咸。

注意:其實右圖要比左圖小了一圈

腐蝕可以理解為B的中心(錨點)沿著A的內(nèi)邊界走了一圈竹捉。腐蝕也是對高亮部分而言,A區(qū)域之外的部分 < A的高亮像素尚骄,所里里面被外面取代块差。

A中能完全包含B的像素被留下來了。

效果圖倔丈,高亮部分被腐蝕


二憨闰、函數(shù)和實例

2.1 函數(shù)源碼

opencv\sources\modules\imgproc\src\morph.cpp
// 腐蝕
void cv::erode( InputArray src, OutputArray dst, InputArray kernel,
                Point anchor, int iterations,
                int borderType, const Scalar& borderValue )
{
    CV_INSTRUMENT_REGION()

    morphOp( MORPH_ERODE, src, dst, kernel, anchor, iterations, borderType, borderValue );
}

// 膨脹
void cv::dilate( InputArray src, OutputArray dst, InputArray kernel,
                 Point anchor, int iterations,
                 int borderType, const Scalar& borderValue )
{
    CV_INSTRUMENT_REGION()

    morphOp( MORPH_DILATE, src, dst, kernel, anchor, iterations, borderType, borderValue );
}

erode和dilate這兩個函數(shù)內(nèi)部就是調(diào)用了一下morphOp,只是調(diào)用morphOp時需五,第一個參數(shù)標識符不同鹉动,一個為MORPH_ERODE(腐蝕),一個為MORPH_DILATE(膨脹)宏邮。

這些函數(shù)在imgproc.hpp中后面的參數(shù)是設置了默認值泽示。

void dilate( InputArray src, OutputArray dst, InputArray kernel,
             Point anchor = Point(-1,-1), int iterations = 1,
             int borderType = BORDER_CONSTANT,
             const Scalar& borderValue = morphologyDefaultBorderValue() );
  • 第三個參數(shù)缸血,InputArray類型的kernel,膨脹操作的核械筛。若為NULL時捎泻,表示的是使用參考點位于中心3x3的核。我們一般使用函數(shù)getStructuringElement返回指定形狀和尺寸的 結(jié)構(gòu)元(SE)埋哟。
Mat getStructuringElement(int shape, Size ksize, Point anchor = Point(-1,-1));
# 第一個參數(shù)表示內(nèi)核的形狀笆豁,我們可以選擇如下三種形狀之一
# 矩形: MORPH_RECT
# 交叉形: MORPH_CROSS
# 橢圓形: MORPH_ELLIPSE
#
# 第二和第三個參數(shù)分別是內(nèi)核的尺寸以及錨點的位置。
# 我們一般在調(diào)用erode以及dilate函數(shù)之前定欧,先定義一個Mat類型的變量來獲得getStructuringElement函數(shù)的返回值渔呵。
# 對于錨點的位置,有默認值Point(-1,-1)砍鸠,表示錨點位于中心扩氢。
# 且需要注意,交叉形的element形狀唯一依賴于錨點的位置爷辱。
# 而在其他情況下录豺,錨點只是影響了形態(tài)學運算結(jié)果的偏移。
  • 第四個參數(shù)饭弓,Point類型的anchor双饥,錨的位置,默認值(-1弟断,-1)咏花,表示錨位于中心。
  • 第五個參數(shù)阀趴,int類型的iterations昏翰,迭代使用erode()函數(shù)的次數(shù),默認值為1刘急。
  • 第六個參數(shù)棚菊,int類型的borderType,用于推斷圖像外部像素的某種邊界模式叔汁。注意它有默認值BORDER_DEFAULT统求。
  • 第七個參數(shù),const Scalar&類型的borderValue据块,當邊界為常數(shù)時的邊界值码邻,有默認值morphologyDefaultBorderValue(),一般我們不用去管他瑰钮。需要用到它時冒滩,可以看官方文檔中的createMorphologyFilter()函數(shù)得到更詳細的解釋。

2.2 實例

#include "opencv2/imgproc/imgproc.hpp"
#include "opencv2/highgui/highgui.hpp"
#include <iostream>

using namespace cv;
using namespace std;


int main() {

    Mat src = imread("../pics/pig.jpg");

    namedWindow("src");
    imshow("src", src);

    // 獲得結(jié)構(gòu)元
    Mat se = getStructuringElement(MORPH_RECT, Size(10, 10));

    Mat dst;
    dilate(src, dst, se); // 后4個參數(shù)使用默認值

    namedWindow("膨脹");
    imshow("膨脹", dst);

    waitKey(0);
}
Size(10, 10)

將膨脹代碼給為腐蝕

erode(src, dst, se);

三浪谴、總結(jié)

雖然膨脹和腐蝕是相反的操作开睡,但是如果用同樣的SE連續(xù)執(zhí)行2個操作,也不一定能恢復原圖苟耻。其實就是開閉操作篇恒。

先腐蝕再膨脹 其實就是開操作??
開操作一般會平滑物體的輪廓,斷開較窄的狹頸并消除細的突出物凶杖。

erode(src, dst, se);
namedWindow("先腐蝕");
imshow("先腐蝕", dst);

dilate(dst, dst, se);
namedWindow("再膨脹");
imshow("再膨脹", dst);

先膨脹再腐蝕 其實就是閉操作??
閉操作也會平滑輪廓的一部分胁艰,但與開操作相反,通常會彌合較窄的間斷和細長的溝壑智蝠,消除小的孔洞腾么,填補輪廓線中的斷裂。

dilate(src, dst, se);
namedWindow("先膨脹");
imshow("先膨脹", dst);

erode(dst, dst, se);
namedWindow("再腐蝕");
imshow("再腐蝕", dst);
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末杈湾,一起剝皮案震驚了整個濱河市解虱,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌漆撞,老刑警劉巖殴泰,帶你破解...
    沈念sama閱讀 218,682評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異浮驳,居然都是意外死亡悍汛,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,277評論 3 395
  • 文/潘曉璐 我一進店門至会,熙熙樓的掌柜王于貴愁眉苦臉地迎上來离咐,“玉大人奉件,你說我怎么就攤上這事宵蛀。” “怎么了瓶蚂?”我有些...
    開封第一講書人閱讀 165,083評論 0 355
  • 文/不壞的土叔 我叫張陵糖埋,是天一觀的道長。 經(jīng)常有香客問我窃这,道長瞳别,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,763評論 1 295
  • 正文 為了忘掉前任杭攻,我火速辦了婚禮祟敛,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘兆解。我一直安慰自己馆铁,他們只是感情好,可當我...
    茶點故事閱讀 67,785評論 6 392
  • 文/花漫 我一把揭開白布锅睛。 她就那樣靜靜地躺著埠巨,像睡著了一般历谍。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上辣垒,一...
    開封第一講書人閱讀 51,624評論 1 305
  • 那天望侈,我揣著相機與錄音,去河邊找鬼勋桶。 笑死脱衙,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的例驹。 我是一名探鬼主播捐韩,決...
    沈念sama閱讀 40,358評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼鹃锈!你這毒婦竟也來了荤胁?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,261評論 0 276
  • 序言:老撾萬榮一對情侶失蹤仪召,失蹤者是張志新(化名)和其女友劉穎寨蹋,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體扔茅,經(jīng)...
    沈念sama閱讀 45,722評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡已旧,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,900評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了召娜。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片运褪。...
    茶點故事閱讀 40,030評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖玖瘸,靈堂內(nèi)的尸體忽然破棺而出秸讹,到底是詐尸還是另有隱情,我是刑警寧澤雅倒,帶...
    沈念sama閱讀 35,737評論 5 346
  • 正文 年R本政府宣布璃诀,位于F島的核電站,受9級特大地震影響蔑匣,放射性物質(zhì)發(fā)生泄漏劣欢。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,360評論 3 330
  • 文/蒙蒙 一裁良、第九天 我趴在偏房一處隱蔽的房頂上張望凿将。 院中可真熱鬧,春花似錦价脾、人聲如沸牧抵。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,941評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽犀变。三九已至妹孙,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間弛作,已是汗流浹背涕蜂。 一陣腳步聲響...
    開封第一講書人閱讀 33,057評論 1 270
  • 我被黑心中介騙來泰國打工华匾, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留映琳,地道東北人。 一個月前我還...
    沈念sama閱讀 48,237評論 3 371
  • 正文 我出身青樓蜘拉,卻偏偏與公主長得像萨西,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子旭旭,可洞房花燭夜當晚...
    茶點故事閱讀 44,976評論 2 355

推薦閱讀更多精彩內(nèi)容