溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

C++ OpenCV如何實現(xiàn)腐蝕與膨脹

發(fā)布時間:2021-11-26 10:13:17 來源:億速云 閱讀:406 作者:小新 欄目:大數(shù)據(jù)

這篇文章主要為大家展示了“C++ OpenCV如何實現(xiàn)腐蝕與膨脹”,內(nèi)容簡而易懂,條理清晰,希望能夠幫助大家解決疑惑,下面讓小編帶領(lǐng)大家一起研究并學(xué)習(xí)一下“C++ OpenCV如何實現(xiàn)腐蝕與膨脹”這篇文章吧。

腐蝕與膨脹

是OpenCV提供的兩種最基本的形態(tài)學(xué)操作

形態(tài)學(xué)操作

  • 簡單來講,形態(tài)學(xué)操作就是基于形狀的一系列圖像處理操作。通過將 結(jié)構(gòu)元素 作用于輸入圖像來產(chǎn)生輸出圖像。

  • 最基本的形態(tài)學(xué)操作有二:腐蝕與膨脹(Erosion 與 Dilation)。 他們的運(yùn)用廣泛:

    • 消除噪聲

    • 分割(isolate)獨(dú)立的圖像元素,以及連接(join)相鄰的元素。

    • 尋找圖像中的明顯的極大值區(qū)域或極小值區(qū)域。

  • 通過以下圖像,我們簡要來討論一下膨脹與腐蝕操作(譯者注:注意這張圖像中的字母為黑色,背景為白色,而不是一般意義的背景為黑色,前景為白色):


    C++ OpenCV如何實現(xiàn)腐蝕與膨脹

 
膨脹
  • 此操作將圖像 C++ OpenCV如何實現(xiàn)腐蝕與膨脹 與任意形狀的內(nèi)核 (C++ OpenCV如何實現(xiàn)腐蝕與膨脹),通常為正方形或圓形,進(jìn)行卷積。

  • 內(nèi)核 C++ OpenCV如何實現(xiàn)腐蝕與膨脹 有一個可定義的 錨點, 通常定義為內(nèi)核中心點。

  • 進(jìn)行膨脹操作時,將內(nèi)核 C++ OpenCV如何實現(xiàn)腐蝕與膨脹 劃過圖像,將內(nèi)核 C++ OpenCV如何實現(xiàn)腐蝕與膨脹 覆蓋區(qū)域的最大相素值提取,并代替錨點位置的相素。顯然,這一最大化操作將會導(dǎo)致圖像中的亮區(qū)開始”擴(kuò)展” (因此有了術(shù)語膨脹 dilation )。對上圖采用膨脹操作我們得到:

C++ OpenCV如何實現(xiàn)腐蝕與膨脹

背景(白色)膨脹,而黑色字母縮小了。

 
腐蝕
  • 腐蝕在形態(tài)學(xué)操作家族里是膨脹操作的孿生姐妹。它提取的是內(nèi)核覆蓋下的相素最小值。

  • 進(jìn)行腐蝕操作時,將內(nèi)核 C++ OpenCV如何實現(xiàn)腐蝕與膨脹 劃過圖像,將內(nèi)核 C++ OpenCV如何實現(xiàn)腐蝕與膨脹 覆蓋區(qū)域的最小相素值提取,并代替錨點位置的相素。

  • 以與膨脹相同的圖像作為樣本,我們使用腐蝕操作。從下面的結(jié)果圖我們看到亮區(qū)(背景)變細(xì),而黑色區(qū)域(字母)則變大了

C++ OpenCV如何實現(xiàn)腐蝕與膨脹

相關(guān)API

C++ OpenCV如何實現(xiàn)腐蝕與膨脹

getStructuringElement

我們可以為我們的內(nèi)核選擇三種形狀之一:

  • 矩形:     MORPH_RECT

  • 交叉形:   MORPH_CROSS

  • 橢圓形:   MORPH_ELLIPSE

然后,我們還需要指定內(nèi)核大小,以及 錨點 位置。不指定錨點位置,則默認(rèn)錨點在內(nèi)核中心位置。

先上干貨

腐蝕和腫脹的Demo演示效果:

代碼演示

新建一個項目opencv-0010,配置屬性(VS2017配置OpenCV通用屬性),然后在源文件寫入#include和main方法.并加載我們常用的那個圖片顯示出來

C++ OpenCV如何實現(xiàn)腐蝕與膨脹

我們先定義element用于做腐蝕和膨脹的操作

在上面設(shè)置兩個參數(shù)

C++ OpenCV如何實現(xiàn)腐蝕與膨脹

定義最大的點和當(dāng)前的點

然后我們還用到了 createTrackbar這個函數(shù).createTrackbar是Opencv中的API,其可在顯示圖像的窗口中快速創(chuàng)建一個滑動控件,用于手動調(diào)節(jié)閾值,具有非常直觀的效果。

膨脹操作

定義膨脹的顯示圖像名稱char showdilate[] = "outputdilate";

定義一個膨脹用的回調(diào)函數(shù)void cv_dilate(int, void*);

C++ OpenCV如何實現(xiàn)腐蝕與膨脹

然后在Main方法中加入創(chuàng)建滑動條,并實現(xiàn)這個膨脹的方法

C++ OpenCV如何實現(xiàn)腐蝕與膨脹

出現(xiàn)效果

C++ OpenCV如何實現(xiàn)腐蝕與膨脹

當(dāng)修改上面滑動條后可以看到很明顯的膨脹效果

C++ OpenCV如何實現(xiàn)腐蝕與膨脹


腐蝕操作

定義腐蝕的顯示窗體名稱和方法

C++ OpenCV如何實現(xiàn)腐蝕與膨脹

我們寫cv_erode的實現(xiàn)方法

C++ OpenCV如何實現(xiàn)腐蝕與膨脹

然后在Main方法里面加入腐蝕的滑動條

C++ OpenCV如何實現(xiàn)腐蝕與膨脹

顯示效果,我們滑動條SIZE調(diào)到2

C++ OpenCV如何實現(xiàn)腐蝕與膨脹


以上是“C++ OpenCV如何實現(xiàn)腐蝕與膨脹”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對大家有所幫助,如果還想學(xué)習(xí)更多知識,歡迎關(guān)注億速云行業(yè)資訊頻道!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI