如何使用OpenCV Python填充多边形

8
我希望能用白色填充这些多边形,然后通过循环遍历整个图像来重复执行此操作,因此我想知道在Python中使用OpenCV执行此操作的语法和函数。 这是我的输入图像。

enter image description here

alist=[]
img = cv2.imread('closing2.jpg',cv2.IMREAD_GRAYSCALE)
imo = cv2.imread('closing2.jpg',cv2.IMREAD_GRAYSCALE)
imr = cv2.imread('closing2.jpg',cv2.IMREAD_GRAYSCALE)*0
imac = imr
height , width  = imo.shape[:2]
a,im = cv2.threshold(img,200,255,cv2.THRESH_BINARY)
# i=100
# p=[i,i]
points = []
for j in range(0,1000,50):
    for i in range(0,1000,50):
        p=[i,j]
        poly = raypoly(im,p,5)
        st = metrics(p,poly)

        polyc=raypolyLimit(im,p,st,30)
        # print(polyc)
        # print(len(polyc))
        # for m in range(len(polyc)):
        #     point = polyc[m]
        #     cv2.fillConvexPoly(im, point, 255)
        plotpoly(polyc,imr)

        plotpolypoints(polyc,imr,255,1)
        # plotray(im,p,imr)

        am = polyArea(polyc)
        # print(am)
        if am > 5:
            alist.append(am)
            # img[(i-5):(i+5),(j-5):(j+5)]=150
            # plt.imshow(imf)
            # plt.show()
        imo = im * 0
        plotpoly(polyc,imo)
        plotpoly(polyc, im)
        # plotArea(polyc,imo)
        imf = imo*1000 +im
        a,imf = cv2.threshold(imf,100.0,255.0,cv2.THRESH_BINARY)
        cv2.imshow('Frame_1', imr)
        cv2.imshow('Frame_3', imo)
        cv2.imshow('Frame_4', imf)
        cv2.imshow('Frame_5', im)
        cv2.waitKey(1)

我使用了下面的函数,并得到以下结果:

cv2.floodFill(imo,None,(i,j),255)

但我的问题是,当多边形的数量达到一定程度时,整个图像会出现白色闪烁,我不知道如何修复它。

enter image description here


1
你是使用空的多边形还是自己创建它们,例如使用 drawContours?如果是后者,只需将 thickness 设置为 FILLED。否则,您可能需要先使用 findContours 找到这些多边形。(然后,您也可以使用 floodFill 等方法。) - HansHirse
我可能夸大了磁盘驱动器和缓存子系统的麻烦程度,但希望你能理解我的意思。只是想帮助工程师们避免“次优实践”;-) - Mark Setchell
@HansHirse 我还编辑了我的问题,提供了所需的输出图像和使用的函数,但是我遇到了一个问题,即图像中出现了白色闪烁,我不知道输入的掩码是否正确。 - Medo2018
如果您得到了一张完全白色的图像,那么您的多边形中有一个没有完全闭合,导致泛洪填充溢出并填满整个图像。 - fmw42
https://dev59.com/CVUK5IYBdhLWcg3w4jUv - Jeru Luke
显示剩余9条评论
1个回答

6

你可以使用cv2.drawContours()来填充轮廓。根据文档,如果thickness参数为负数(thickness=CV_FILLEDthickness=-1),那么轮廓会被填充。例如,要用白色填充轮廓:

cv2.drawContours(image, [c], -1, (255,255,255), -1)

思路是使用cv2.findContours()找到所需的轮廓,然后使用cv2.drawContours()填充。 对于您的图像:

enter image description here

import cv2

image = cv2.imread('1.jpg')
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
thresh = cv2.threshold(gray, 120, 255, cv2.THRESH_BINARY)[1]
cnts = cv2.findContours(thresh, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
cnts = cnts[0] if len(cnts) == 2 else cnts[1]

for c in cnts:
    cv2.drawContours(image, [c], -1, (255,255,255), -1)

cv2.imshow('image', image)
cv2.waitKey()

非常感谢您,那个解决方案正是我想要的。 - Medo2018

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接