简单来说,这是一个可用输入和我想要的相应输出的示例:
In: [ 0 0 0 0 0 0 1 0 1 0
0 6 6 0 0 0 0 1 1 0
0 8 9 0 0 0 0 0 1 1
8 0 0 0 9 9 0 0 0 0
0 0 0 0 8 8 0 0 0 0
0 0 0 0 0 0 0 0 0 0
9 9 7 0 0 0 0 0 1 0
0 6 8 0 0 0 0 3 2 0
0 0 0 0 0 0 0 2 1 0
0 0 0 0 0 0 0 0 0 0 ]
使用cv2.connectedComponents()进行二值化并获取标记图像后:
labels: [ 0 0 0 0 0 0 1 0 1 0
0 2 2 0 0 0 0 1 1 0
0 2 2 0 0 0 0 0 1 1
2 0 0 0 3 3 0 0 0 0
0 0 0 0 3 3 0 0 0 0
0 0 0 0 0 0 0 0 0 0
4 4 4 0 0 0 0 0 5 0
0 4 4 0 0 0 0 5 5 0
0 0 0 0 0 0 0 5 5 0
0 0 0 0 0 0 0 0 0 0 ]
以下是我想要的输出结果:
Out: [0 0 0 0 0 0 0 0 0 0
0 6 6 0 0 0 0 0 0 0
0 8 9 0 0 0 0 0 0 0
8 0 0 0 9 9 0 0 0 0
0 0 0 0 8 8 0 0 0 0
0 0 0 0 0 0 0 0 0 0
9 9 7 0 0 0 0 0 0 0
0 6 8 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 ]
在这里有许多连接的组件 (例如: 8连通中的5个组件)。那些像素和小于10(一个阈值)的In的组件将被移除到Out中。
我该如何用C++实现它(可能要使用OpenCV)?
我已经在Python中使用OpenCV完成了它,但无法在C++上实现。
以下是我的Python代码的一部分,如果有用(labels是cv2.connectedComponents()的输出):
for cnt in range(1, labels.max()+1):
idx = np.where(labels.copy() == cnt)
valMat = In[idx]
sum_valMat = sum(valMat)
if sum_valMat > 3000:
fingerNodes[idx] = 0
输入是一个简单的二维矩阵。这是连通组件的一个示例: