matlab图像的腐蚀和膨胀_OpenCV图像处理系列八 --- 腐蚀与膨胀
今天,我們一起來學(xué)習(xí)圖像形態(tài)學(xué)操作中兩種最基本的形態(tài)學(xué)操作,即腐蝕與膨脹。
一、理論
數(shù)學(xué)形態(tài)學(xué)(Mathematical morphology) 是一門建立在格論和拓?fù)鋵W(xué)基礎(chǔ)之上的圖像分析學(xué)科,是數(shù)學(xué)形態(tài)學(xué)圖像處理的基本理論。其基本的運(yùn)算包括:腐蝕和膨脹、開運(yùn)算和閉運(yùn)算、骨架抽取、極限腐蝕、擊中擊不中變換、形態(tài)學(xué)梯度、Top-hat變換、顆粒分析、流域變換等。
腐蝕與膨脹主要實(shí)現(xiàn)以下功能:
- 消除噪聲
- 分割(isolate)出獨(dú)立的圖像元素,在圖像中連接(join)相鄰的元素。
- 尋找圖像中的明顯的極大值區(qū)域或極小值區(qū)域
- 求出圖像的梯度
1、腐蝕
腐蝕對(duì)圖像求局部最小值;腐蝕操作就是將圖像(或圖像的一部分區(qū)域,我們稱之為A)與卷積核(我們稱之為B)進(jìn)行卷積。
核可以是任何的形狀和大小,它擁有一個(gè)單獨(dú)定義出來的參考點(diǎn),我們稱其為錨點(diǎn)。多數(shù)情況下,核是一個(gè)小的中間帶有參考點(diǎn)和實(shí)心正方形或者圓盤,其實(shí),我們可以把核視為模板或者掩碼。
1)腐蝕的數(shù)學(xué)表達(dá)式
腐蝕的數(shù)學(xué)表達(dá)式
2)腐蝕效果演示
腐蝕效果演示
3)腐蝕的作用:
- 對(duì)象大小減小一個(gè)像素(3x3)
- 平滑對(duì)象邊緣
- 弱化或者分割圖像之間的半島型連接
2、膨脹
膨脹對(duì)圖像求局部的最大值;核B與圖形卷積,即計(jì)算核B覆蓋的區(qū)域的像素點(diǎn)的最大值,并把這個(gè)最大值賦值給參考點(diǎn)指定的像素;這樣就會(huì)使圖像中的高亮區(qū)域逐漸增長。
核可以是任何的形狀和大小,它擁有一個(gè)單獨(dú)定義出來的參考點(diǎn),我們稱其為錨點(diǎn)。多數(shù)情況下,核是一個(gè)小的中間帶有參考點(diǎn)和實(shí)心正方形或者圓盤,其實(shí),我們可以把核視為模板或者掩碼。
1)膨脹的數(shù)學(xué)表達(dá)式
膨脹的數(shù)學(xué)表達(dá)式
膨脹效果演示
膨脹的作用:
- 對(duì)象大小增加一個(gè)像素(3x3)
- 平滑對(duì)象邊緣
- 減少或者填充對(duì)象之間的距離
小結(jié):
可以看做膨脹是將白色區(qū)域擴(kuò)大,腐蝕是將黑色區(qū)域擴(kuò)大。
二、OpenCV腐蝕與膨脹API函數(shù)詳解
1、腐蝕
1)函數(shù)原型:
void erode(InputArray src, OutputArray dst, InputArray kernel, Point anchor = Point(-1, -1), int iterations = 1, int borderType = BORDER_CONSTANT, const Scalar& borderValue = morphologyDefaultBorderValue());2)函數(shù)功能:
用指定的卷積核腐蝕圖像,使用像素鄰域內(nèi)的局部極小運(yùn)算符來腐蝕一張圖片,從src輸入,由dst輸出,支持就地(in-place)操作。
3)參數(shù)詳解:
- 第一個(gè)參數(shù),InputArray類型的src,輸入圖像,即源圖像,填Mat類的對(duì)象即可。圖像通道的數(shù)量可以是任意的,但圖像深度應(yīng)為CV_8U,CV_16U,CV_16S,CV_32F或 CV_64F其中之一;
- 第二個(gè)參數(shù),OutputArray類型的dst,即目標(biāo)圖像,需要和源圖片有一樣的尺寸和類型;
- 第三個(gè)參數(shù),InputArray類型的kernel,腐蝕操作的內(nèi)核。若為NULL時(shí),表示的是使用參考點(diǎn)位于中心3x3的核。我們一般使用函數(shù) getStructuringElement配合這個(gè)參數(shù)的使用。getStructuringElement函數(shù)會(huì)返回指定形狀和尺寸的結(jié)構(gòu)元素(內(nèi)核矩陣);
- 第四個(gè)參數(shù),Point類型的anchor,錨的位置,其有默認(rèn)值(-1,-1),表示錨位于單位(element)的中心,我們一般不用管它;
- 第五個(gè)參數(shù),int類型的iterations,迭代使用erode()函數(shù)的次數(shù),默認(rèn)值為1;
- 第六個(gè)參數(shù),int類型的borderType,用于推斷圖像外部像素的某種邊界模式。注意它有默認(rèn)值BORDER_DEFAULT;
- 第七個(gè)參數(shù),const Scalar&類型的borderValue,當(dāng)邊界為常數(shù)時(shí)的邊界值,有默認(rèn)值morphologyDefaultBorderValue(),一般我們不用去管他。
第三個(gè)參數(shù)一般用getStructuringElement()函數(shù)獲取卷積核的大小;getStructuringElement函數(shù)會(huì)返回指定形狀和尺寸的結(jié)構(gòu)元素(內(nèi)核矩陣)。
其中,getStructuringElement函數(shù)的第一個(gè)參數(shù)表示內(nèi)核的形狀,我們可以選擇如下三種形狀之一:
- 矩形: MORPH_RECT
- 交叉形: MORPH_CROSS
- 橢圓形: MORPH_ELLIPSE
而getStructuringElement函數(shù)的第二和第三個(gè)參數(shù)分別是內(nèi)核的尺寸以及錨點(diǎn)的位置。
我們一般在調(diào)用erode以及dilate函數(shù)之前,先定義一個(gè)Mat類型的變量來獲得getStructuringElement函數(shù)的返回值。對(duì)于錨點(diǎn)的位置,有默認(rèn)值Point(-1, -1),表示錨點(diǎn)位于中心;并且需要注意,十字形的element形狀唯一依賴于錨點(diǎn)的位置;而在其他情況下,錨點(diǎn)只是影響了形態(tài)學(xué)運(yùn)算結(jié)果的偏移。
4)實(shí)例:
#include #include #include #include using namespace std;using namespace cv;int main(){ //載入原圖 Mat image = imread("lena.png"); if (image.empty()) { printf("image error!"); return -1; } //創(chuàng)建窗口 namedWindow("【原圖】腐蝕操作"); namedWindow("【效果圖】腐蝕操作"); //顯示原圖 imshow("【原圖】腐蝕操作總結(jié)
以上是生活随笔為你收集整理的matlab图像的腐蚀和膨胀_OpenCV图像处理系列八 --- 腐蚀与膨胀的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 借呗欠50000会坐牢吗?
- 下一篇: matlab 叠加 area,[转载]m