Python:根据 1 和 0 的数组计算结构的面积和周长

Python: Compute the area and perimeter of structures from arrays of ones and zeros

我面临以下问题:我有两个 1 和 0 的二维数组(相同形状;(1920,1440)),它们指定了对象的蒙版和轮廓。这里,1表示space被所述对象占用,0表示空space(1表示轮廓,0表示空space)。

您可以在此处找到掩码阵列的图形表示:https://ibb.co/v36TrJv and here you can find a graphical representation of the outlines array: https://ibb.co/FxKwmTq。 1 用白色表示,0 用黑色表示。

如您所见,蒙版形成椭圆形结构,不重叠,轮廓始终形成闭合轮廓。我现在想计算每个结构占用的面积以及周长。理想情况下,我最终会得到两个与输入数组形状相同的二维数组。在这里,第一个数组将在掩码数组值为 1 的点处保存每个结构的区域。类似地,第二个阵列将在这些点处保持每个结构的相应周长。我需要输出数组采用这种形式,以便我可以进行形状索引计算并生成结果的图形表示。

作为最小可重现示例,您可以从提供的链接下载图像并使用以下代码从中提取数组:

import skimage.io as sio
import numpy as np

masks = sio.imread("masks.png")
masks = np.mean(masks, axis =2)/255

outlines = sio.imread("outlines.png")
outlines = np.mean(outlines, axis=2)/255

我已经对 OpenCV 进行了一些尝试,因为它显然具有专门为我正在寻找的应用程序设计的功能。然而,到目前为止,我的努力还没有产生任何显着的结果。我尝试从 OpenCV 文档 (https://docs.opencv.org/trunk/dd/d49/tutorial_py_contour_features.html) 的轮廓特征部分改编示例代码:

import cv2 as cv
img = cv.imread('masks.png',0)
ret,thresh = cv.threshold(img,127,255,0)
contours,hierarchy = cv.findContours(thresh, 1, 2)
cnt = contours[0]
print(cnt)

到这里,结果好像不是我要的。我也尝试调整阈值但没有成功。我无法弄清楚我必须进行哪些调整才能使用 OpenCV 获得我想要的结果。

此外,我遇到了格林定理 (https://en.wikipedia.org/wiki/Green%27s_theorem) 并正在考虑为我的目的尝试实现它。但我想我首先要寻求一些外部帮助,因为我觉得应该有一个更直接的解决方案来解决我的问题。任何帮助将不胜感激!

OpenCV 的轮廓将完成您的工作。我认为你对他们的理解是错误的。在您的代码中,contours[0] 只会给出检测到的第一个轮廓。然而,您应该像 for contour in contours: 一样遍历轮廓变量,然后对于每个轮廓,使用您共享的文档中给出的函数获取面积和周长,并将这些详细信息存储在列表列表中。因此,您的最终列表的大小为 n×2,其中 n 是图像中对象的数量。

此外,这里有一个建议,在您分享的第一张图片中找到对象填充为 1 且背景为 0 的轮廓。此外,为了安全起见,因为所有对象都是分开的,请在查找轮廓时使用 RETR_EXTERNAL 作为标志。请参阅 OpenCV 文档以获取更多相关信息。