numpy 在Python中查找二进制图像中两个轮廓之间的所有像素

x3naxklr  于 2023-04-06  发布在  Python
关注(0)|答案(1)|浏览(110)

我有一个二进制图像,如下图所示,其中有两个轮廓显示为白色,

我想使所有的像素之间的轮廓白色一些东西如下,

如何在Python中使用Numpy或OpenCV或Scipy来实现这一点?
我目前使用的FloodFill如下所示,

from PIL import Image, ImageDraw
# read image
seed = [377,273]
rep_value = (255, 255, 0)
ImageDraw.floodfill(img, seed, rep_value, thresh=50)
img.save(f'cloud_floodfill_{seed}.png')

但是这里我需要提供一个seed值。我有成千上万的像这样的图像,其中两个轮廓可以在任何地方转换。如何自动化几个图像的过程。
我猜OpenCV的FloodFill也会有同样的限制。

c86crjj0

c86crjj01#

方法:

  • findContours
    *走在阶层
  • 创建新等高线列表
  • 画出来

此特定配置的层次结构在遍历时将包含:

  • 外轮廓
  • 轮廓内轮廓
  • “内联”外轮廓
  • 内联内轮廓

您希望在轮廓内轮廓和内联外轮廓之间有一个区域。

contours, hierarchy = cv.findContours(im, cv.RETR_TREE, cv.CHAIN_APPROX_SIMPLE)

# hierarchy is a vector<Vec4i> -> row vector of Vec4i, so (1,N,4), weird shape
hierarchy = hierarchy.squeeze(0) # remove that 1-dimension
composite = im.copy()

outline_outer = 0
outline_inner = hierarchy[outline_outer, 2]
inline_outer = hierarchy[outline_inner, 2]

new_contours = [contours[outline_inner], contours[inline_outer]]

cv.drawContours(image=composite, contours=new_contours, contourIdx=-1, color=255, thickness=cv.FILLED)

这个插图是通过绘制到BGR版本中完成的,用红色,然后覆盖源代码,使其看起来很漂亮。
该方法可以扩展到任意数量和嵌套。只是需要更多的工作来遍历层次结构。

相关问题