代码之家  ›  专栏  ›  技术社区  ›  Jürgen K.

值错误:无法从<U12转换为uint8

  •  0
  • Jürgen K.  · 技术社区  · 6 年前

    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.
    

    图像的路径是有值的。你知道怎么解决这个问题吗?提前谢谢

    1 回复  |  直到 6 年前
        1
  •  1
  •   amanb    6 年前

    <U12 无法转换为dtype uint8 . 要检查图像文件的数据类型,请将其转换为numpy数组。我得到了 <U38 我的图像的数据类型:

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

    你应该先用 skimage.io.imread(image_path) . 这将返回MxN、MxNx3或MxNx4的ndarray。如果需要将其转换为2D或3D,则需要将其转换为2D或3D 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
    • 要重塑为2D,首先要获得 sk_image.strides . 对于我的图像,我得到(390,3,1),然后用 sk_image.transpose(1,0,2) sk_image.transpose(1,0,2).strides :(3390,1)。然后,使用 reshape sk_image.transpose(1, 0, 2).reshape(130,-1) 重塑为二维阵列。您会注意到,重塑尺寸是根据步幅值(390/2)粗略计算的。

    here .