cv2.connectedComponents не работает должным образом

Я хочу использовать функцию cv2.connectedComponents для подключения компонентов к двоичному изображению, как показано ниже...

изображение.

Все работает, кроме выводимого массива меток. В этом массиве только нули, а не порядковые номера, как указано, в соответствии с идентифицированными компонентами.

import cv2
import numpy as np

img = cv2.imread('eGaIy.jpg', 0)
img = cv2.threshold(img, 127, 255, cv2.THRESH_BINARY)[1]  # ensure binary
ret, labels = cv2.connectedComponents(img)

# Map component labels to hue val
label_hue = np.uint8(179*labels/np.max(labels))
blank_ch = 255*np.ones_like(label_hue)
labeled_img = cv2.merge([label_hue, blank_ch, blank_ch])

# cvt to BGR for display
labeled_img = cv2.cvtColor(labeled_img, cv2.COLOR_HSV2BGR)

# set bg label to black
labeled_img[label_hue==0] = 0

cv2.imshow('labeled.png', labeled_img)
cv2.waitKey()

выведенные метки --> labels.shape: (256L, 250L)

[[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 ..., 0 0 0]
 [0 0 0 ..., 0 0 0]]

person freddykrueger    schedule 16.01.2018    source источник
comment
каково значение рет?   -  person api55    schedule 16.01.2018
comment
ret — количество обнаруженных компонентов   -  person freddykrueger    schedule 16.01.2018
comment
Я знаю, что это такое, я просто бродил, давал ли он вам 1 (только фоновая метка) или обычный номер. Я проверю это, чтобы увидеть, могу ли я воспроизвести ошибку   -  person api55    schedule 16.01.2018
comment
Это дает мне белые компоненты, а не 1 фоновый компонент... Знаете ли вы, почему массив содержит только нули?   -  person freddykrueger    schedule 16.01.2018
comment
Я тестирую его сам, и он работает, он дает мне тот же результат, что и глушитель, скопируйте и вставьте свой код .... если вы печатаете массив numpy, вы не видите все значения, где он имеет ... означает, что у вас есть куча там другие значения. Простым тестом было бы выполнить np.sum(labels), если это 0, то это только 0. Вы также можете попробовать предложение глушителя для вашего теста.   -  person api55    schedule 16.01.2018
comment
Возникает новая проблема... «использовать связанные компоненты cv2 и исключить элементы с небольшим количеством пикселей»> stackoverflow.com/questions/48303309/   -  person freddykrueger    schedule 17.01.2018


Ответы (1)


Меня устраивает:

введите здесь описание изображения введите здесь описание изображения


И вы должны быть осторожны, чтобы функция нашла только компонент, отличный от нуля. В исходном изображении компонентами являются края. И возвращенное изображение помечается как тот же размер источника.

Результат

[[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 ..., 0 0 0]
 [0 0 0 ..., 0 0 0]]

представляют только 4 угловых области (3x3), все нули, но это не означает, что все элементы нули.


Если вы вызываете это после вызова cv2.connectedComponents:

print(set(labels.reshape(-1).tolist()))

Ты получишь:

{0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14}

Это означает, что существует 14 компонентов (ребер) и 1 фон (0).

person Kinght 金    schedule 16.01.2018
comment
Я уже знаю, что алгоритм работает визуально. Я сохранил массив: метки как .csv, используя алгоритм numpy. savetxt и содержит только нули. Почему? - person freddykrueger; 16.01.2018
comment
Для меня нормально, когда np.savetxt("t.txt", labels) содержит все числа от 0 до 14 в формате с плавающей запятой. Проверьте еще раз на своем компьютере. Заметьте, почти все нули, не все нули. - person Kinght 金; 16.01.2018
comment
Почти все нули, не все нули. ... Ты прав! Спасибо! - person freddykrueger; 16.01.2018
comment
Как-то так, 0.000000000000000000e+00 1.000000000000000000e+00 0.000000000000000000e+00. Найти ненулевое значение нелегко, но почему бы не поискать 1~9 в txt? - person Kinght 金; 16.01.2018
comment
Возникает новая проблема... «использовать связанные компоненты cv2 и исключить элементы с небольшим количеством пикселей»> stackoverflow.com/questions/48303309/ - person freddykrueger; 17.01.2018
comment
@freddykrueger Готово! stackoverflow.com/questions/48303309/ - person Kinght 金; 17.01.2018