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

标签 python arrays opencv shapes contour

我面临以下问题:我有两个 1 和 0 的二维数组(相同的形状;(1920,1440)),它们指定了对象的掩码和轮廓。这里,1表示所述对象占用的空间,0表示空白空间(1表示轮廓,0表示空白空间)。
在这里您可以找到掩码数组的图形表示:https://ibb.co/v36TrJv在这里您可以找到轮廓数组的图形表示: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 文档以获取更多信息。

关于Python:根据 1 和 0 的数组计算结构的面积和周长,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62880759/

相关文章:

c++ - 在两个不同的 OpenCV 窗口中显示相同的鼠标光标

python - 如何逐字使用括号中的变量

java - IBM Watson Assistant、Telegram 和 Python

java - 如何在Java中创建不规则形状的二维数组

matlab - 如何检测一个棋盘角?

c++ - OpenCV 3 中未在此范围内声明消息 "‘CV_SHAPE_ELLIPSE’

python - 在python中使用random.random生成随机样本

python - Django 'polls' 不是注册的命名空间

java - 在JAVA中创建不固定大小的字节数据结构的最佳方法是什么

c++ - std::array 作为虚函数中的参数