【问题标题】:ValueError: Can not convert from <U12 to uint8ValueError:无法从 <U12 转换为 uint8
【发布时间】:2019-06-28 04:13:22
【问题描述】:

我尝试了以下example。这应该显示图像处理结果。

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.

图像的路径是一个有价值的路径。你知道如何解决这个问题吗?提前致谢

【问题讨论】:

    标签: python scipy scikit-image valueerror


    【解决方案1】:

    问题是从图像返回的 ndarray 的 dtype &lt;U12 无法转换为 dtype uint8。要检查图像文件的 dtype,请将其转换为 numpy 数组。我得到了一个&lt;U38 dtype 用于我的图像:

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

    您应该首先阅读带有skimage.io.imread(image_path) 的图像。这将返回 MxN、MxNx3 或 MxNx4 的 ndarray。然后,将生成的 ndarray 重塑为 2D(如果它是 3D 或 4D)。这种转换是必需的,因为skimage.filters.rank.median(image) 接受二维形​​状的图像 ndarray。在以下代码中,我使用示例图像执行了这些步骤,然后将其传递给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--->  
    

    我得到以下图片:

    您应该考虑以下几点:

    • 检查imread返回的图像数组的形状:用sk_image = imread('CAPTURE.jpg')读取图像后,用sk_image.shape检查数组的形状。对于我的图像,我得到的形状是 (74, 130, 3),它显示了一个 3D 数组。
    • 若要重塑为 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) 重塑为二维数组。您会注意到,重塑尺寸是根据步幅值(390/2)粗略计算的。

    P.S:您可以阅读更多关于 numpy 数组的 3D 到 2D 重塑here

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-10-14
      • 1970-01-01
      相关资源
      最近更新 更多