OpenCV 3.3.0中connectedComponents函数4连通性不生效问题咨询
问题原因及解决方法
嘿,我一眼就看出问题出在哪了——你把connectedComponents的参数传错啦!
在OpenCV 3.3.0的Python绑定里,connectedComponents的函数签名可不是你想的那样:第二个参数不是连通性参数。实际的参数顺序是:
cv2.connectedComponents(image[, labels[, connectivity[, ltype]]])
也就是说,连通性是第三个可选参数,默认值是8(8连通)。你写的cv2.connectedComponents(img, 4)里,4被当成了第二个参数labels(输出的标签矩阵)来处理,但这个参数是用来接收输出的,不是用来指定连通性的,所以OpenCV直接忽略了这个无效输入,依旧使用默认的8连通规则。这就导致对角的两个像素被判定为同一连通组件了。
正确的调用方式
要指定4连通,你需要用关键字参数明确指定connectivity,或者按完整参数顺序传递(前面传None占位labels参数):
方法1:用关键字参数(推荐,更清晰)
import numpy as np import cv2 img = np.zeros((4,4), dtype = np.uint8) img[1,1] = 255 img[2,2] = 255 # 明确指定连通性为4 num_labels, labels = cv2.connectedComponents(img, connectivity=4) print(labels)
方法2:按参数顺序传递
num_labels, labels = cv2.connectedComponents(img, None, 4)
修正后的结果
运行上面的代码,你会得到符合预期的输出:
[[0 0 0 0] [0 1 0 0] [0 0 2 0] [0 0 0 0]]
两个对角像素被标记为不同的连通组件(标签1和2),这才是4连通规则下的正确结果。
补充说明
- 4连通规则:只考虑上下左右四个相邻的像素;
- 8连通规则:除了上下左右,还包括四个对角方向的像素,这也是OpenCV的默认设置。
以后调用OpenCV的函数时,要是对参数拿不准,记得查对应版本的官方文档,避免参数顺序搞混哦~
内容的提问来源于stack exchange,提问作者Adrian
相关产品推荐
相关产品推荐

