TypeError: labels не является ни массивом numpy, ни скаляром

Просто начиная с cv2, я хочу дать начальное значение объекту, как в каком-то окне координат, и соединить все пиксели, которые могут находиться за пределами исходного поля координат, но соприкасаться с ним. Я начал с небольших тестов, чтобы получить представление о связанных компонентах:

im=cv2.imread('test.png', 0)
ret, thresh = cv2.threshold(im, 254, 255, cv2.THRESH_BINARY)
output = cv2.connectedComponentsWithStats(thresh, 4, cv2.CV_32S)

тогда

im=cv2.imread('test.png', 0)
ret, thresh = cv2.threshold(im, 254, 255, cv2.THRESH_BINARY)
thresh = cv2.bitwise_not(thresh)
output = cv2.connectedComponents(thresh, 4, cv2.CV_32S)

оба этих выходных массива, пока все хорошо, тогда я хотел увидеть фактическое выходное изображение со ссылкой на документы https://docs.opencv.org/3.0-beta/modules/imgproc/doc/structural_analysis_and_shape_descriptors.html#connectedcomponentsconnectedComponentsWithStats(InputArray image, OutputArray labels, OutputArray stats, OutputArray centroids, int connectivity=8, int ltype=CV_32S) и labels – destination labeled image поэтому я изменил последнюю строку в небольшом коде, приведенном выше, к этому:

output = cv2.connectedComponents(thresh,"out_test.png" ,4, cv2.CV_32S)

и это дало мне ошибку, указанную в вопросе. Я также пробовал:

cv2.imwrite(dest_dir+"out_test.png", output)

и получил эту ошибку:

TypeError: img is not a numerical tuple

как я могу на самом деле визуализировать вывод, поскольку я не хочу подсчитывать капли (объекты), их размеры или что-то еще, я просто хочу, чтобы они росли из исходной области интереса, которую я даю.


person Nelly    schedule 14.06.2018    source источник


Ответы (2)


Если вы хотите, чтобы белые пятна росли, вы можете использовать морфологические преобразования.

Поймите, что делает функция, прежде чем использовать ее

cv2.connectedComponents

Help on built-in function connectedComponents:

connectedComponents(...)
    connectedComponents(image[, labels[, connectivity[, ltype]]]) -> retval, labels
    .   @overload
    .   
    .   @param image the 8-bit single-channel image to be labeled
    .   @param labels destination labeled image
    .   @param connectivity 8 or 4 for 8-way or 4-way connectivity respectively
    .   @param ltype output image label type. Currently CV_32S and CV_16U are supported

Ответ @ausk должен быть вам полезен

import cv2

в терминале после открытия python, затем

Пример

help(cv2.connectedComponents)

Надеюсь это поможет

import cv2
import numpy as np
from matplotlib import pyplot as plt

image = cv2.imread("image.jpg")
grayscaleImage = cv2.cvtColor(image,cv2.COLOR_BGR2GRAY)
thresholdedImage = np.zeros((image.shape[0],image.shape[1]),np.uint8)
thresholdedImage[grayscaleImage<250]=[255]

interestedObjects, interestedObjectContours, interestedObjectsHierarchy = cv2.findContours(thresholdedImage,cv2.RETR_CCOMP, cv2.CHAIN_APPROX_NONE)


for i, l in enumerate(interestedObjectContours):
    rect = cv2.minAreaRect(interestedObjectContours[i])
    box = cv2.boxPoints(rect)
    box = np.int0(box)
    box[box < 0] = 0
    cv2.drawContours(image, [box], 0, (0, 255, 0), 2)


plt.subplot(111), plt.imshow(cv2.cvtColor(image,cv2.COLOR_BGR2RGB))
plt.title('Your objects detected image'), plt.xticks([]), plt.yticks([])
plt.show()
person Santhosh Dhaipule Chandrakanth    schedule 14.06.2018
comment
Я хочу, чтобы он соединял прикрепленные пиксели, например, если я предоставлю совершенно пустое изображение с квадратом где-то в его середине, и если я дам ему координаты части квадрата, он должен найти все это и вырасти, чтобы дать весь квадрат как вывод, это не то, для чего нужны морфологические преобразования. - person Nelly; 14.06.2018
comment
Понятно, если у нас есть только границы квадрата на черном изображении. Вы хотите, чтобы весь квадрат превратился в белые пиксели. Это правильно? - person Santhosh Dhaipule Chandrakanth; 14.06.2018
comment
Для моей конкретной задачи не будет только границ, объекты заполнены, и моя задача в основном состоит в том, чтобы иметь часть черных пикселей (объектов) на белом фоне, иметь возможность заставить обрезанные объекты выводить их полный размер, что я d дать в качестве входных данных исходное полное изображение и координаты области обрезки, если вы хотите отредактировать свой ответ, чтобы смоделировать аналогичный случай, я был бы признателен. - person Nelly; 14.06.2018
comment
Чтобы помочь вам, я хочу знать, какие будут входные данные colour image или binary image, я хочу знать вашу конечную цель. предложить вам решение. - person Santhosh Dhaipule Chandrakanth; 14.06.2018
comment
Изображение Rgb, тогда я должен сделать необходимую модификацию, если это необходимо, но обратите внимание, что изображение в основном черно-белое, но все же в rgb. - person Nelly; 14.06.2018
comment
Вы можете использовать threshold весь белый фон, а затем использовать findcontour findContour а затем нарисуйте этот контур, используя ограничивающий прямоугольник на исходном изображение - person Santhosh Dhaipule Chandrakanth; 14.06.2018

person    schedule
comment
Спасибо за ответ, не могли бы вы объяснить немного больше, например, что я сделал неправильно и к каким типам изображений мы можем применить подключенные компоненты (rgb, оттенки серого, двоичные...), а также направить меня к более подробное объяснение, отличное от документов, потому что они довольно кратки для новичка. - person Nelly; 14.06.2018