Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/353.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/opencv/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何在图像边缘填充圆形轮廓?_Python_Opencv - Fatal编程技术网

Python 如何在图像边缘填充圆形轮廓?

Python 如何在图像边缘填充圆形轮廓?,python,opencv,Python,Opencv,在上图中,我希望最终能够填充彩色圆圈的轮廓。不幸的是,底部的黄色圆圈正好位于图像的边缘,因此cv2.findContours不起作用: _, green_contours, _ = cv2.findContours(green_seg, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE) 有人知道我如何填充黄色圆圈的轮廓,即使它在图像的边缘?因为它位于图像的边缘,所以图像底部边缘的像素值没有完成圆,如果有意义的话,它的值不是255 我在网上看了一下,有人说可

在上图中,我希望最终能够填充彩色圆圈的轮廓。不幸的是,底部的黄色圆圈正好位于图像的边缘,因此cv2.findContours不起作用:

_, green_contours, _ = cv2.findContours(green_seg, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
有人知道我如何填充黄色圆圈的轮廓,即使它在图像的边缘?因为它位于图像的边缘,所以图像底部边缘的像素值没有完成圆,如果有意义的话,它的值不是255

我在网上看了一下,有人说可以在图像周围画一个大框,然后画轮廓,但如果我这样做,opencv只会在整个图像周围画一个大轮廓,而不是画圆

任何其他想法都将不胜感激


编辑:我上面展示的图片只是我正在考虑的一个案例。我正试图思考如何使其足够通用,以便对于边界边缘的任何轮廓,我仍然可以使用cv2.drawContour填充轮廓。

如果有或多或少的凸多边形,实际上可以使用cv2.FindContour。获得轮廓后,尝试找到重心,例如使用,然后将其用作中的种子点

请参阅下面的代码片段。我想,你可以通过颜色来识别你的多边形。另外,我没有使用质心的高级查找,而是使用了每个轮廓的边界矩形的中心点。也许,这对于您的用例来说也足够了

进口cv2 将numpy作为np导入 设置测试映像 颜色=[0,255,0,0,0,255] 输入=np.zeros400,400,3,np.uint8 cv2.circleinput,10010050,颜色[0],10 cv2.circleinput,150350,75,颜色[1],10 输出=输入。复制 迭代所有颜色。。。 对于i,c的颜色: 遮罩颜色 img=np.alloutput==c,轴=2.astypenp.uint8*255 查找与OpenCV版本相关的轮廓 cnts=cv2.findContoursimg,cv2.RETR\u外部,cv2.CHAIN\u近似值\u无 如果lencnts==2,则cnts=cnts[0],否则cnts[1] 获取边界矩形;导出洪水填充的种子点;填海 rects=[cv2.boundingRectc代表碳纳米管中的碳] seeds=[np.int32r[0]+r[2]/2,对于矩形中的r,np.int32r[1]+r[3]/2] [cv2.floodFilloutput,mask=None,seedPoint=s,newVal=c表示种子中的s] cv2.imshow'input',input cv2.imshow'output',output cv2.0 cv2.1所有窗口 这就是输入:

这就是输出:

希望有帮助

-------------------- 系统信息 -------------------- 平台:Windows-10-10.0.16299-SP0 Python:3.8.1 NumPy:1.18.1 OpenCV:4.1.2 --------------------
如果您有或多或少的凸多边形,实际上可以使用cv2.findContours。获得轮廓后,尝试找到重心,例如使用,然后将其用作中的种子点

请参阅下面的代码片段。我想,你可以通过颜色来识别你的多边形。另外,我没有使用质心的高级查找,而是使用了每个轮廓的边界矩形的中心点。也许,这对于您的用例来说也足够了

进口cv2 将numpy作为np导入 设置测试映像 颜色=[0,255,0,0,0,255] 输入=np.zeros400,400,3,np.uint8 cv2.circleinput,10010050,颜色[0],10 cv2.circleinput,150350,75,颜色[1],10 输出=输入。复制 迭代所有颜色。。。 对于i,c的颜色: 遮罩颜色 img=np.alloutput==c,轴=2.astypenp.uint8*255 查找与OpenCV版本相关的轮廓 cnts=cv2.findContoursimg,cv2.RETR\u外部,cv2.CHAIN\u近似值\u无 如果lencnts==2,则cnts=cnts[0],否则cnts[1] 获取边界矩形;导出洪水填充的种子点;填海 rects=[cv2.boundingRectc代表碳纳米管中的碳] seeds=[np.int32r[0]+r[2]/2,对于矩形中的r,np.int32r[1]+r[3]/2] [cv2.floodFilloutput,mask=None,seedPoint=s,newVal=c表示种子中的s] cv2.imshow'input',input cv2.imshow'output',output cv2.0 cv2.1所有窗口 这就是输入:

这就是输出:

希望有帮助

-------------------- 系统信息 -------------------- 平台:Windows-10-10.0.16299-SP0 Python:3.8.1 NumPy:1.18.1 OpenCV:4.1.2 --------------------
一种可能不太精确的简单方法是计算每个轮廓的凸面外壳,并使用填充颜色绘制内部:


一种可能不太精确的简单方法是计算每个轮廓的凸面外壳,并使用填充颜色绘制内部:


手工画线。找到位于轮廓边缘的黄色轮廓点,用cv2画一条线。line?@Ahmet感谢您的回复!但是我需要能够用代码自动完成,因为有很多这样的情况。你确定填充不起作用吗?你能发送原始图像让我试试吗?你完全可以在面具周围画一个盒子!你只需要画一个黑色的bo
是的,不是白边!如果它是白色的,它将是轮廓的一部分。如果是黑色的,就不会是黑色的。简单到:。只需使用copymakeborder将你的蒙面图像保存为PNG,这样它就完全是黑白的,并用它编辑你的文章。应该足够了!不要在图像上画图,用额外的边框填充图像,即图像会稍大一些。然后需要移动轮廓结果的位置,因为填充图像的每个轮廓点将在x、y方向上增加1个像素。手动绘制线条。找到位于轮廓边缘的黄色轮廓点,用cv2画一条线。line?@Ahmet感谢您的回复!但是我需要能够用代码自动完成,因为有很多这样的情况。你确定填充不起作用吗?你能发送原始图像让我试试吗?你完全可以在面具周围画一个盒子!你只需要画一个黑边框,而不是白边框!如果它是白色的,它将是轮廓的一部分。如果是黑色的,就不会是黑色的。简单到:。只需使用copymakeborder将你的蒙面图像保存为PNG,这样它就完全是黑白的,并用它编辑你的文章。应该足够了!不要在图像上画图,用额外的边框填充图像,即图像会稍大一些。然后你需要移动轮廓结果的位置,因为你的填充图像将在x,y方向的每个轮廓点上增加1个像素。非常感谢你的评论!我真的很抱歉我忘了提到,但我的图片不一定都是在底部。它们可能在左侧、右侧或顶部。所以,在我看来,泛光填充不起作用,因为我必须实际查看它以查看轮廓的位置。@cmed123这个答案是说从轮廓的中心使用泛光填充,而不是从边界,所以你的评论无关紧要。但是,此注释假定轮廓是凸的。否则,无法保证质心实际上在轮廓内,因此这仍然不是一个通用的解决方案。非常感谢您的评论!我真的很抱歉我忘了提到,但我的图片不一定都是在底部。它们可能在左侧、右侧或顶部。所以,在我看来,泛光填充不起作用,因为我必须实际查看它以查看轮廓的位置。@cmed123这个答案是说从轮廓的中心使用泛光填充,而不是从边界,所以你的评论无关紧要。但是,此注释假定轮廓是凸的。否则,无法保证质心实际上在轮廓内,所以这仍然不是一般的解决方案。
import cv2
import numpy as np
import sys

# load input image from the cmd-line
img = cv2.imread('test_images/partial_contour.png')
if (img is None):
    print('!!! Failed imread')
    sys.exit(-1)

output_img = img.copy()

# isolate just the colored drawings
ret, thres_bgr = cv2.threshold(img, 0, 255, cv2.THRESH_BINARY)
thres_bgr[np.where((thres_bgr == [255,255,255]).all(axis=2))] = [0,0,0] # replace white pixels for black

# convert from 3-channels (BGR) to a single channel (gray)
gray_img = cv2.cvtColor(thres_bgr, cv2.COLOR_BGR2GRAY)

# this loop processes all the contours found in the image
contours, hierarchy = cv2.findContours(gray_img, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
for contourIdx, cnt in enumerate(contours):
    # compute a convex hull
    hull = cv2.convexHull(cnt)

    # fill the inside with red
    cv2.fillPoly(output_img, pts=[hull], color=(0, 0, 255))

cv2.imshow('output_img', output_img)
cv2.imwrite('fill_partial_cnt_output.png', output_img)
cv2.waitKey(0)