首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ValueError:无法从<U12转换为uint8

ValueError:无法从<U12转换为uint8
EN

Stack Overflow用户
提问于 2019-02-04 12:12:24
回答 1查看 2.1K关注 0票数 0

我尝试了下面的示例。这应该显示图像处理的结果。

代码语言:javascript
复制
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()

我得到了跟踪错误。

代码语言:javascript
复制
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.

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

EN

回答 1

Stack Overflow用户

发布于 2019-02-04 15:05:37

问题是,从图像返回的ndarray具有dtype <U12,不能转换为dtype uint8。若要检查图像文件的dtype,请将其转换为numpy数组。我得到了我的图像的<U38类型:

代码语言:javascript
复制
np.array('CAPTURE.jpg')
#array('Capture.JPG', dtype='<U38')

您应该首先使用skimage.io.imread(image_path)读取图像。这将返回MxN、MxNx3或MxNx4的ndarray。然后,如果它的3D或4D的话,将生成的ndarray重塑为2D。这种转换是必需的,因为skimage.filters.rank.median(image)接受2D形状的图像ndarray。在下面的代码中,在传递到img_as_ubyte(sk_image)之前,我使用了我的示例映像来执行这些步骤。其余代码保持不变。

代码语言:javascript
复制
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)的值。然后,使用reshapesk_image.transpose(1, 0, 2).reshape(130,-1)对2D数组进行整形。您会注意到,重塑维度是从步幅值(390/2)粗略计算出来的。

P.S:您可以阅读更多关于numpy数组这里的3D到2D整形的信息。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54515842

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档