python - OpenCV2中connectedComponents的统计信息

标签 python numpy opencv image-processing

我想使用来自connectedComponents的组件的坐标以及opencv中的统计信息,以将其用作图像的 slice 器,然后可以在其上处理cv2.minAreaRect之后的cv2.findContours。但是我的问题是统计数据:

cv2.CC_STAT_LEFT, cv2.CC_STAT_TOP, cv2.CC_STAT_WIDTH, cv2.CC_STAT_WIDTH, cv2.CC_STAT_HEIGHT

不要给我组件的正确位置。例如:
import cv2
import numpy as np
img = np.zeros((30,30),dtype=np.uint8)
img[10:21,10:21] = 1
img[20,21] = 1
img[21,21] = 1
img[20,22] = 1
img[21,22] = 1
numLabels, labelMatrix, stats, centroids = cv2.connectedComponentsWithStats(img, 8, cv2.CV_8UC1)
coods = np.argwhere(labelMatrix == 1)
print(min(coods[:,0]),max(coods[:,0]),min(coods[:,1]),max(coods[:,1]))
print(stats[1][cv2.CC_STAT_TOP],(stats[1][cv2.CC_STAT_TOP]+stats[1][cv2.CC_STAT_WIDTH]),stats[1][cv2.CC_STAT_LEFT],(stats[1][cv2.CC_STAT_LEFT]+stats[1][cv2.CC_STAT_HEIGHT]))

输出
10 21 10 22
10 23 10 22

在这个小例子中,x max位置的差异只是2,但是在某些情况下,它们的差异更大。现在我想知道为什么会这样吗?因为我无论如何都必须计算connectedComponentWithStats,所以我想使用这些坐标,而不要使用numpy argwhere。

最佳答案

您已将高度和宽度交换。

试试这个:

print(
(stats[1][cv2.CC_STAT_TOP]), 
(stats[1][cv2.CC_STAT_TOP]+stats[1][cv2.CC_STAT_HEIGHT]),
(stats[1][cv2.CC_STAT_LEFT]),
(stats[1][cv2.CC_STAT_LEFT]+stats[1][cv2.CC_STAT_WIDTH]))


如果将这行与最后一行交换,您将获得:
10 21 10 22
10 22 10 23

您会注意到,您与原始版本仍然相距1分,这是因为CC结果是排他性的,而min / max是包含性的。

关于python - OpenCV2中connectedComponents的统计信息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57524850/

相关文章:

Python/Pandas/Numpy - 直接计算两个日期之间不包括节假日的工作日数

具有命名字段访问的 python 张量

python - Python(OpenCV)与Arduino之间的串行通信结束

c++ - KalmanFilter(6,2,0) 转换矩阵

python - DICOM 图像处理、可视化和 GUI-C++ 和 Python

python - 在 Python DataFrame 中拆分字符串

python - 如何合并 2 个 numpy 数组?

python - Django - 将用户设置为不活动 5 秒

python - PyCharm 社区 3.1.1 和 Numpy, "' 矩阵'不可调用”,但代码有效

python - Pandas 多索引计数出现次数