关于python:填充轮廓OpenCV的外部

您所在的位置:网站首页 opencv填充不规则轮廓 关于python:填充轮廓OpenCV的外部

关于python:填充轮廓OpenCV的外部

2024-04-24 17:34| 来源: 网络整理| 查看: 265

我正在尝试使用openCV和python语言将轮廓的外部区域涂成黑色。 这是我的代码:

12345contours, hierarchy = cv2.findContours(copy.deepcopy(img_copy),cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE) areas = [cv2.contourArea(c) for c in contours] max_index = np.argmax(areas) cnt=contours[max_index] # how to fill of black the outside of the contours cnt please? `

这是在一组轮廓之外用黑色填充图像的方法:

123456789import cv2 import numpy img = cv2.imread("zebra.jpg") stencil = numpy.zeros(img.shape).astype(img.dtype) contours = [numpy.array([[100, 180], [200, 280], [200, 180]]), numpy.array([[280, 70], [12, 20], [80, 150]])] color = [255, 255, 255] cv2.fillPoly(stencil, contours, color) result = cv2.bitwise_and(img, stencil) cv2.imwrite("result.jpg", result)

UPD .:上面的代码利用了一个事实,即bitwise_and带有0-s会产生0-s,并且不适用于黑色以外的填充颜色。 要填充任意颜色:

12345678910111213141516171819202122import cv2 import numpy img = cv2.imread("zebra.jpg") fill_color = [127, 256, 32] # any BGR color value to fill with mask_value = 255            # 1 channel white (can be any non-zero uint8 value) # contours to fill outside of contours = [ numpy.array([ [100, 180], [200, 280], [200, 180] ]),              numpy.array([ [280, 70], [12, 20], [80, 150]])            ] # our stencil - some `mask_value` contours on black (zeros) background, # the image has same height and width as `img`, but only 1 color channel stencil  = numpy.zeros(img.shape[:-1]).astype(numpy.uint8) cv2.fillPoly(stencil, contours, mask_value) sel      = stencil != mask_value # select everything that is not mask_value img[sel] = fill_color            # and fill it with fill_color cv2.imwrite("result.jpg", img)

也可以填充其他图像,例如,使用img[sel] = ~img[sel]而不是img[sel] = fill_color会用轮廓之外的相同倒置图像填充它:

相关讨论 谢谢兄弟,我很感激。每当你在丹佛的时候,我都叫我病 @Bill如果可以回答您的问题,请接受/支持。无需帮忙; D @Miki,放开我的恩惠,一get而就就拒绝您的恩惠! :) @Headcrab我真的很抱歉...每当你在米兰时,Ping我..病会让你受宠; D @ Mvk1312这取决于图像类型。为什么要用白色而不是黑色填充? 嘿@Headcrab实际上正在尝试检测图像上的形状区域(表格),然后必须只返回该区域并从图像中排除非形状区域。 @ Mvk1312如果仅使用cv2.imread()函数加载平均jpeg,则白色可能会变为[255, 255, 255]。或者,对于单通道图像,只需255。 @Headcrab,实际上我尝试了您的解决方案。结果与我的要求不同。我需要的是除检测到的表区域外,所有区域应为白色背景。你可以帮帮我吗! @ Mvk1312如果您有形状/轮廓,并且想用背景色填充其他所有内容,请参见我的答案中的第二段(更新的)代码。否则,我不太了解您的要求,然后尝试提出另一个问题。 好吧,我将尝试该解决方案@Headcrab,您能告诉我白色的数组值以填充外部区域吗?



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3