Я пытаюсь извлечь ди git из зашумленного изображения, используя Floodfill в пикселях возле центра .
Вот мой код:
import cv2
import numpy as np
import random
def floodFillCenter(img):
mask = np.zeros([img.shape[0]+2,img.shape[1]+2],dtype=np.uint8) # Mask is totally black
# Floodfill on random black pixels near the center
width = img.shape[1]
height = img.shape[0]
floodedAreaWidth = 10
floodedAreaHeight = 10
numberOfTimesFlood = 20
ignoredNumber = 0 # This value is ignored we set flags to FLOODFILL_MASK_ONLY
floodflags = 8 # Flood 8 directions
floodflags |= cv2.FLOODFILL_MASK_ONLY
floodflags |= (255 << 8) # Fill corresponding pixels in mask with 255 (white)
count = 0
for row in range(height//2-floodedAreaHeight, height//2+floodedAreaHeight):
for col in range(width//2-floodedAreaWidth, width//2+floodedAreaWidth):
if count == numberOfTimesFlood:
return mask
if img[row][col] == 0: # If we hit a black pixels in the middle, flood
_,_,mask,_ = cv2.floodFill(img, mask, (row,col), ignoredNumber, 0, 0, floodflags)
count += 1
cv2.imwrite("Mask" + str(count) + ".jpg", mask)
return mask
img = cv2.imread("8.jpg", cv2.IMREAD_GRAYSCALE)
_, img = cv2.threshold(img, 50, 255, cv2.THRESH_BINARY) # Get a binary image (0 or 255)
cv2.imwrite("AfterThreshold.jpg", img)
img = floodFillCenter(img)
cv2.imwrite("FinalMask.jpg", img)
Я заливаю 20 раз (так, чтобы хотя бы один пиксель был частью di git), в надежде, что он заполнит весь di git и исключит большую часть шума .
Все отлично работает для первых 13 масок:
(AfterThreshold.jpg)
13.jpg"> (Mask1-> 13.jpg - то же изображение)
Однако из Mask14.jpg получилось странно:
20.jpg"> (Mask14-> 20.jpg - то же изображение)
Мне нужно затопить столько раз, так как мне не всегда везет (получи всю ди git правильно с первого раза). Иногда рядом с центром появляются шумы, а иногда ди-1042 * может быть не полностью подключен.
Кто-нибудь может объяснить, почему со мной происходит эта странная вещь?
Спасибо очень много!