ValueError: Невозможно преобразовать из - PullRequest
0 голосов
/ 04 февраля 2019

Я опробовал следующий пример .Это должно показать результаты обработки изображений.

from scipy import ndimage as ndi
import matplotlib.pyplot as plt
from scipy import misc
import numpy as np
import cv2

from skimage.morphology import watershed, disk
from skimage import data
from skimage.filters import rank
from skimage.util import img_as_ubyte

from skimage import io; io.use_plugin('matplotlib')

image = img_as_ubyte('imagepath.jpg')

# denoise image
denoised = rank.median(image, disk(2))

# find continuous region (low gradient -
# where less than 10 for this image) --> markers
# disk(5) is used here to get a more smooth image
markers = rank.gradient(denoised, disk(5)) < 10
markers = ndi.label(markers)[0]

# local gradient (disk(2) is used to keep edges thin)
gradient = rank.gradient(denoised, disk(2))

# process the watershed
labels = watershed(gradient, markers)

# display results
fig, axes = plt.subplots(nrows=2, ncols=2, figsize=(8, 8),
                         sharex=True, sharey=True)
ax = axes.ravel()

ax[0].imshow(image, cmap=plt.cm.gray, interpolation='nearest')
ax[0].set_title("Original")

ax[1].imshow(gradient, cmap=plt.cm.nipy_spectral, interpolation='nearest')
ax[1].set_title("Local Gradient")

ax[2].imshow(markers, cmap=plt.cm.nipy_spectral, interpolation='nearest')
ax[2].set_title("Markers")

ax[3].imshow(image, cmap=plt.cm.gray, interpolation='nearest')
ax[3].imshow(labels, cmap=plt.cm.nipy_spectral, interpolation='nearest', alpha=.7)
ax[3].set_title("Segmented")

for a in ax:
    a.axis('off')

fig.tight_layout()
plt.show()

Я получаю следующую ошибку.

Traceback (most recent call last):
  File "/home/workspace/calculate_watershed.py", line 15, in <module>
    image = img_as_ubyte('koralle0.jpg')
  File "/home/workspace/venv/lib/python3.5/site-packages/skimage/util/dtype.py", line 409, in img_as_ubyte
    return convert(image, np.uint8, force_copy)
  File "/home/workspace/venv/lib/python3.5/site-packages/skimage/util/dtype.py", line 113, in convert
    .format(dtypeobj_in, dtypeobj_out))
ValueError: Can not convert from <U12 to uint8.

Путь к изображению является ценным.У вас есть идеи, как решить эту проблему?Заранее спасибо

1 Ответ

0 голосов
/ 04 февраля 2019

Проблема в том, что ndarray, возвращенный из вашего изображения, имеет dtype <U12, который нельзя преобразовать в dtype uint8.Чтобы проверить dtype вашего файла изображения, преобразуйте его в массив numpy.Я получаю <U38 dtype для моего изображения:

np.array('CAPTURE.jpg')
#array('Capture.JPG', dtype='<U38')

Сначала вы должны прочитать изображение с помощью skimage.io.imread(image_path).Это вернет ndarray MxN, MxNx3 или MxNx4.Затем измените результирующий ndarray на 2D, если это 3D или 4D.Это преобразование требуется, потому что skimage.filters.rank.median(image) принимает изображение с изображением 2D-формы.В следующем коде я использовал мой пример изображения для выполнения этих шагов, прежде чем перейти к img_as_ubyte(sk_image).Остальная часть кода остается прежней.

from skimage.io import imread
#<---code--->
sk_image = imread('CAPTURE.jpg') #read the image to convert to skimage ndarray
sk_image = sk_image.transpose(1,0,2).reshape(130,-1) #convert to 2D array
image = img_as_ubyte(sk_image) #Convert image to 8-bit unsigned integer format.
#<---code--->  

Я получаю следующие изображения:

skimages

Необходимо учитывать следующие моменты:

  • Проверьте форму массива изображения, возвращенного из imread: После считывания изображения с помощью sk_image = imread('CAPTURE.jpg'), проверьте форму массива с помощью sk_image.shape.Для моего изображения я получаю форму (74, 130, 3), которая показывает трехмерный массив.
  • Чтобы преобразовать в 2D, сначала получите шаги с sk_image.strides.Для моего изображения я получаю (390, 3, 1), затем транспонирую с sk_image.transpose(1,0,2).Вы также можете проверить шаги после транспонирования, и вы заметите, что значения поменялись местами sk_image.transpose(1,0,2).strides: (3, 390, 1).Затем используйте reshape: sk_image.transpose(1, 0, 2).reshape(130,-1) для преобразования в 2D-массив.Вы заметите, что размеры формы были примерно рассчитаны из значения шага (390/2).

PS: Вы можете узнать больше о трехмерном преобразовании числовых массивов здесь .

...