
左為原圖 右為填充后
針對輪廓填充,我們先要提取影像中的輪廓,在對里面的進行顏色填充,這個我自己也有點分不清楚,他和閾值分割進行填充有什么區別,要是有大佬知道,分享一下,將感激不盡!輪廓填充的方法常用的是泛洪演算法!
孔洞填充就是在二值化下,影像中出現了“白點”或者“黑點”,這會影響我們計算輪廓里面的面積計算!
孔洞填充在這里我們針對的是二值圖,并不是灰度圖!
在OpenCV中實作imfill的步驟
閱讀以下步驟時請參考下圖.
- 讀取圖片,
- 將輸入影像二值化,
- 從像素(0,0)填充顏色,請注意,步驟2和步驟3的輸出之間的差異在于步驟3中的影像的背景現在是白色的,
- 反轉洪水填充的影像(即黑色變為白色,白色變為黑色),
- 使用按位OR運算將閾值影像與反向洪水填充影像組合以獲得填充有孔的最終前景掩模,步驟4中的影像在邊界內具有一些黑色區域,通過步驟2,填充了影像中的孔,因此,我們將兩者結合起來得到前景蒙版,

左為二值化取反圖 右為二值化圖
簡單來說就是兩張背景不變影像,將輪廓里面的顏色取反,再將兩張圖片合并,這樣就能對輪廓里面的“孔洞”進行填充;
方法很笨,但是有效!
重點來啦,上代碼!!!!!
import cv2;
import numpy as np;
'''
影像說明:
影像為二值化影像,255白色為目標物,0黑色為背景
要填充白色目標物中的黑色空洞
'''
imgPath = "H:/image.jpg"
im_in = cv2.imread(imgPath, cv2.IMREAD_GRAYSCALE);
# 復制 im_in 影像
im_floodfill = im_in.copy()
# Mask 用于 floodFill,官方要求長寬+2
h, w = im_in.shape[:2]
mask = np.zeros((h+2, w+2), np.uint8)
# floodFill函式中的seedPoint必須是背景
isbreak = False
for i in range(im_floodfill.shape[0]):
for j in range(im_floodfill.shape[1]):
if(im_floodfill[i][j]==0):
seedPoint=(i,j)
isbreak = True
break
if(isbreak):
break
# 得到im_floodfill
cv2.floodFill(im_floodfill, mask, seedPoint, 255);
# 得到im_floodfill的逆im_floodfill_inv
im_floodfill_inv = cv2.bitwise_not(im_floodfill)
# 把im_in、im_floodfill_inv這兩幅影像結合起來得到前景
im_out = im_in | im_floodfill_inv
cv2.imshow('de',im_out)
cv2.waitKey(0)
cv2.destroyAllWindows()

謝謝點贊評論!
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/272163.html
標籤:AI
上一篇:資訊論篇-第一次上機作業,你好!
