У меня есть следующий код, в котором я пытаюсь получить часть изображения, соответствующую маске, которую мне дали. Затем я хотел бы применить к этой части skimage.feature.glcm. Но я получаю сообщение об ошибке:
glcm = greycomatrix(mancha, [2], [0], levels=None, symmetric = True, normed = True)
File "D:\WinPython-64bit-2.7.13.1ZeroNew\python-2.7.13.amd64\lib\site-packages\skimage\feature\texture.py", line 101, in greycomatrix
assert_nD(image, 2)
File "D:\WinPython-64bit-2.7.13.1ZeroNew\python-2.7.13.amd64\lib\site-packages\skimage\_shared\utils.py", line 178, in assert_nD
raise ValueError(msg_incorrect_dim % (arg_name, '-or-'.join([str(n) for n in ndim])))
ValueError: The parameter `image` must be a 2-dimensional array
Код:
mask = cv2.imread(pathMask, 0)
cruda = cv2.imread(pathCruda, 0)
imaskc = mask > 0
mancha = cruda[imaskc]
glcm = greycomatrix(mancha, [2], [0], levels=None, symmetric = True, normed = True)
energy = greycoprops(glcm, 'energy')
homogeneity = greycoprops(glcm, 'homogeneity')
Я также безуспешно пытался:
labeled_image, nb_labels = ndimage.label(mascara)
blobs = ndimage.find_objects(labeled_image)
glcm = greycomatrix(cruda[blobs[0]]
Любые идеи, как это сделать?
Спасибо!
a = [[1, 2], [3, 4]]
, а у вас маскаb = [[1, 0], [1, 1]]
, то результатa[b] = [1, 3, 4]
. Так что это не двумерный массив. Он не может вернуть 2D-массив, если в каждой строке есть разное количество замаскированных элементов, поэтому он никогда этого не делает. Однако, если вы просто хотите сделать все за пределами маски черным, вы можете легко сделать это с помощьюcruda[~imaskc] = 0
. - person alkasm   schedule 01.12.2017True
, а 0 — этоFalse
. Как должно выглядеть возвращениеa[b]
в этом примере? - person alkasm   schedule 02.12.2017glcm
требует двумерного ввода. Индексация с маской просто дает все элементы, соответствующие маске, линейно. Другими словами: еслиa = np.array([[1, 2], [3, 4]])
иb = np.array([[1, 0], [1, 1]])
, тоa[b] = np.array([1, 3, 4])
, но то, что вы, вероятно, хотите, этоa[~b] = 0
, таким образом,a = np.array([[1, 0], [3, 4]])
, который является двумерным. - person alkasm   schedule 04.12.2017cruda[min_row:max_row, min_col:max_col]
. Но вам все равно нужно заранее замаскировать, если вы хотите, чтобы значения были удалены. - person alkasm   schedule 04.12.2017cruda[~mask]=0
установит черный цвет везде, кроме замаскированной области --- это правильно. Опять же, вы не можете передатьcruda[mask==255]
в функцию, так как эта маскированная индексация всегда возвращает линейный массив и никогда не возвращает двумерный массив. Я даже не знаю, что такоеglcm
, поэтому я не знаю, каков правильный вывод. Я просто указываю разные способы маскировать или индексировать изображение, чтобы получить то, что вы хотите. - person alkasm   schedule 04.12.2017np.where()
и найти минимальные/максимальные значения x, y, полученные таким же образом. Но обратите внимание, опять же — это даст вам только подмножество вашего изображения в виде прямоугольника, а не в форме маски, поскольку это невозможно сделать. - person alkasm   schedule 04.12.2017