OpenCV Python: FloodFill ведет себя странно - PullRequest
0 голосов
/ 04 апреля 2020

Я пытаюсь извлечь ди 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 масок:

After threshold.jpg (AfterThreshold.jpg)

image13.jpg"> (Mask1-> 13.jpg - то же изображение)

Однако из Mask14.jpg получилось странно:

image20.jpg"> (Mask14-> 20.jpg - то же изображение)

Мне нужно затопить столько раз, так как мне не всегда везет (получи всю ди git правильно с первого раза). Иногда рядом с центром появляются шумы, а иногда ди-1042 * может быть не полностью подключен.

Кто-нибудь может объяснить, почему со мной происходит эта странная вещь?

Спасибо очень много!

...