如何解决无法使用scikit图像将RGB图像转换为灰度
我试图将RGB图像转换为Otsu二值图像(灰度),但是由于出现如下所述的错误,因此似乎不起作用。
from cv2 import cv2
import numpy as np
from skimage.color import rgb2gray
from skimage.filters import threshold_otsu
from skimage.io import imread
from skimage.morphology import skeletonize
from skimage.util import invert
import matplotlib.pyplot as plt
img = rgb2gray(imread('Ared.png'))
binary = img > threshold_otsu(img)
np.unique(binary)
skeleton = skeletonize(invert(binary))
cv2.imshow('original',img)
cv2.imshow('skeleton',skeleton)
cv2.waitKey(0)
cv2.destroyAllWindows()
终端结果
img = rgb2gray(imread('Ared.png'))
Traceback (most recent call last):
File "preprocessing.py",line 16,in <module>
cv2.imshow('skeleton',skeleton)
TypeError: Expected Ptr<cv::UMat> for argument '%s'
解决方法
坏的异常消息很糟糕...
cv2.imshow
不处理二进制数组。根据{{3}}答案,可接受的类型为uint8
,uint16
,int
,float
和double
。
您应该可以使用以下命令将数组转换为uint8
:
skeleton.astype('u1')
这将使您的值介于0到1之间,但都非常暗。如果将数组乘以255,则颜色应为预期的黑白:
skeleton.astype('u1') * 255
有关skimage中数据图像的完整示例:
from cv2 import cv2
from skimage.filters import threshold_otsu
from skimage.morphology import skeletonize
from skimage.util import invert
from skimage.data import camera
img = camera()
binary = img > threshold_otsu(img)
skeleton = skeletonize(invert(binary))
cv2.imshow('original',img)
cv2.imshow('skeleton',skeleton.astype('u1')*255)
cv2.waitKey(0)
cv2.destroyAllWindows()
,
您的格式错误。您需要将其更改为float32。这是opencv的常见错误。您可以更改此行以将其转换为float32,它应该可以正常工作。
cv2.imshow('skeleton',np.float32(skeleton))
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。