填写OpenCV中的圈子

时间:2018-05-21 14:05:37

标签: python algorithm opencv

我一直在努力解决这个问题。我一直在尝试用Python中的OpenCV中的某种方式来填充图像中的圆圈,而这些圆圈完全是黑白的。

要清楚这个图像已经使用自适应阈值进行了阈值处理,但现在我已经拥有了这些我希望能够填写的环。理想情况下,无论使用哪种算法来填充圆圈都应该能够我包含的图片。

如果有人能在这方面提供任何指导,我会非常感激。

算法之前: Before Algorithm

算法后: After Algorithm

算法之前: Before Algorithm

算法后: After Algorithm

2 个答案:

答案 0 :(得分:2)

Google中的简单搜索会为您提供this article,这完全可以回答您的问题。

我为你的输入采用了这个解决方案:

import cv2
import numpy as np

# Read image
im_in = cv2.imread("circles.jpg", cv2.IMREAD_GRAYSCALE)

# Threshold
th, im_th = cv2.threshold(im_in, 127, 255, cv2.THRESH_BINARY)

# Copy the thresholded image
im_floodfill = im_th.copy()

# Mask used to flood filling.
# NOTE: the size needs to be 2 pixels bigger on each side than the input image
h, w = im_th.shape[:2]
mask = np.zeros((h+2, w+2), np.uint8)

# Floodfill from point (0, 0)
cv2.floodFill(im_floodfill, mask, (0,0), 255)

# Invert floodfilled image
im_floodfill_inv = cv2.bitwise_not(im_floodfill)

# Combine the two images to get the foreground
im_out = im_th | im_floodfill_inv

# Display images.
cv2.imwrite("circles_filled.png", im_out)

输入文件circles.png:

Circles

输出文件circles_filled.png:

Filled circles

答案 1 :(得分:1)

您还可以通过绘制轮廓来填充圆圈。

import cv2
import numpy as np


#Run Main
if __name__ == "__main__" :

    image = cv2.imread("circle.jpg", -1)

    gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)

    ret,thresh = cv2.threshold(gray, 200, 255, cv2.THRESH_BINARY)

    _,contours,_ = cv2.findContours(thresh, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE)

    cv2.drawContours(image, contours, -1, (255,255,255), thickness=-1)

    cv2.namedWindow('Image', cv2.WINDOW_NORMAL)
    cv2.imshow('Image', image)
    cv2.waitKey(0)
    cv2.destroyAllWindows()

image1 image2