opencv形態(tài)學(xué)中的孔洞填充詳細(xì)圖解
1. 原理
孔洞指的是被前景像素點(diǎn)或者說(shuō)感興趣的像素點(diǎn)包圍起來(lái)的區(qū)域,這個(gè)區(qū)域是我們不感興趣的背景區(qū)域。
數(shù)字圖像處理的孔洞填充的公式為:
I 為前景像素 ,c 為補(bǔ)集
其實(shí)孔洞填充的步驟就是一個(gè)迭代的過(guò)程:
先設(shè)置一個(gè)填充的起始點(diǎn),需要在孔洞的內(nèi)部。如d圖所示,然后被結(jié)構(gòu)元B(圖c)膨脹。
然后,為了將膨脹的結(jié)果限制在孔洞內(nèi)部,需要和原圖(圖a)的補(bǔ)集(圖b)相交(圖e),因?yàn)槿绻豢刂婆蛎浀慕Y(jié)果的話,那么膨脹會(huì)填充整個(gè)區(qū)域,而膨脹結(jié)果和原圖的補(bǔ)集相交,會(huì)使結(jié)果限制到我們感興趣的區(qū)域內(nèi)部,也就是孔洞。
其次,重復(fù)這個(gè)過(guò)程,直到第k步和第k+1的步驟結(jié)果相同,那么我們可以認(rèn)為孔洞已經(jīng)被填充完畢(圖h)
最后,和原圖相加即可(圖i)
2. 漫水填充算法
注:這里的mask必須為圖像長(zhǎng)寬+2,且類型要是uint8
我們對(duì)下面圖像做孔洞填充
# -*- coding: utf-8 -*- import cv2 import numpy as np def holefill(img): img_copy = img.copy() mask = np.zeros((img.shape[0]+2,img.shape[1]+2),dtype=np.uint8) cv2.floodFill(img,mask,(0,0),255) img_inverse = cv2.bitwise_not(img) dst = cv2.bitwise_or(img_copy,img_inverse) return dst img = cv2.imread('hole.png',0) thresh , img = cv2.threshold(img,127,255,cv2.THRESH_BINARY) img_copy =img.copy() dst = holefill(img) cv2.imshow('img',np.hstack((img_copy,dst))) cv2.waitKey() cv2.destroyAllWindows()
處理的結(jié)果為
代碼詳解:
1. 首先將圖像進(jìn)行二值化處理,轉(zhuǎn)為二值圖像
2. 通過(guò)圖像的長(zhǎng)和寬設(shè)置掩膜mask,類型為uint8
3. floodFill 會(huì)對(duì)原圖像進(jìn)行操作,所以事先需要拷貝圖像,將漫水的種子設(shè)為(0,0)也就是圖像的左上角,填充的顏色為255。雖然通過(guò)計(jì)算找到孔洞的位置,然后直接填充就可以,但是這樣比較麻煩,且孔洞較多的時(shí)候不好處理。這里我們將除了 前景像素點(diǎn)和孔洞 的位置都填充為前景像素點(diǎn),然后通過(guò)求反就可以得到所有的孔洞的位置
4. 最后將孔洞和原圖相加即可
到此這篇關(guān)于opencv形態(tài)學(xué)中的孔洞填充詳細(xì)圖解的文章就介紹到這了,更多相關(guān)opencv孔洞填充內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
sqlalchemy實(shí)現(xiàn)時(shí)間列自動(dòng)更新教程
這篇文章主要介紹了sqlalchemy實(shí)現(xiàn)時(shí)間列自動(dòng)更新教程,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-09-09Python多進(jìn)程通信Queue、Pipe、Value、Array實(shí)例
這篇文章主要介紹了Python多進(jìn)程通信Queue、Pipe、Value、Array實(shí)例,queue和pipe用來(lái)在進(jìn)程間傳遞消息、Value + Array 是python中共享內(nèi)存映射文件的方法,需要的朋友可以參考下2014-11-11解決pip install xxx報(bào)錯(cuò)SyntaxError: invalid syntax的問(wèn)題
今天小編就為大家分享一篇解決pip install xxx報(bào)錯(cuò)SyntaxError: invalid syntax的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-11-11通過(guò)Folium在地圖上展示數(shù)據(jù)Python地理可視化的入門(mén)示例詳解
這篇文章主要介紹了通過(guò)Folium在地圖上展示數(shù)據(jù)Python地理可視化的入門(mén),在本文中,我們介紹了如何使用Python中的Folium庫(kù)進(jìn)行地理可視化,通過(guò)Folium,我們可以輕松地創(chuàng)建交互式地圖,并在地圖上展示數(shù)據(jù)、繪制形狀、添加圖例和文本標(biāo)簽等,需要的朋友可以參考下2024-05-05python使用rstrip函數(shù)刪除字符串末位字符
rstrip函數(shù)用于刪除字符串末位指定字符,默認(rèn)為空白符,這篇文章主要介紹了python使用rstrip函數(shù)刪除字符串末位字符的方法,需要的朋友可以參考下2023-04-04Python中摘要算法MD5,SHA1簡(jiǎn)介及應(yīng)用實(shí)例代碼
這篇文章主要介紹了Python中摘要算法MD5,SHA1簡(jiǎn)介及應(yīng)用實(shí)例代碼,具有一定借鑒價(jià)值,需要的朋友可以參考下2018-01-01使用keras實(shí)現(xiàn)孿生網(wǎng)絡(luò)中的權(quán)值共享教程
這篇文章主要介紹了使用keras實(shí)現(xiàn)孿生網(wǎng)絡(luò)中的權(quán)值共享教程,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-06-06Python通過(guò)zookeeper實(shí)現(xiàn)分布式服務(wù)代碼解析
這篇文章主要介紹了Python通過(guò)zookeeper實(shí)現(xiàn)分布式服務(wù)代碼解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-07-07