无法使用scikit图像将RGB图像转换为灰度

2024-05-08 01:55:16 发布

您现在位置:Python中文网/ 问答频道 /正文

我曾尝试将RGB图像转换为大津二值图像(灰度),但这似乎不起作用,因为我得到了下面提到的错误

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'

Tags: from图像importimgthresholdasnpcv2
2条回答

错误的异常消息是错误的

cv2.imshow不处理二进制数组。根据this答案,可接受的类型为uint8uint16intfloatdouble

您应该能够使用以下命令将数组转换为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))

相关问题 更多 >