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

Posted

技术标签:

【中文标题】无法使用 scikit 图像将 RGB 图像转换为灰度【英文标题】:Not able to convert RGB image to gray scale using scikit image 【发布时间】:2021-02-24 16:04:18 【问题描述】:

我尝试将 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'

【问题讨论】:

根本不是答案,但是您是否尝试过查看 skeleton 变量(例如打印它)?您应该检查其值的范围([0, 1] ? [0, 255] ?)及其类型(float ? uint8 ?)我觉得问题不在于您使用 skimage,而在于 cv2当被要求显示图像时有点挑剔。 使用调试器比较img和skeleton的数据类型(int数组、float32数组等),它们可能不同但应该相同。 【参考方案1】:

您的格式错误。您需要将其更改为 float32。这是 opencv 的常见错误。您可以更改此行以将其转换为 float32,它应该可以正常工作。

cv2.imshow('skeleton', np.float32(skeleton))

【讨论】:

【参考方案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()

【讨论】:

以上是关于无法使用 scikit 图像将 RGB 图像转换为灰度的主要内容,如果未能解决你的问题,请参考以下文章

python库skimage 将针对灰度图像的滤波器用于RGB图像 逐通道滤波;转换为HSV图像滤波

使用 PIL 将 RGB 图像变成纯黑白图像

将 Mat 中的 RGB 图像转换为 MFC 中的 BYTE *

使用 OpenCV 将 RGB 图像转换为二进制图像

将numpy数组转换为rgb图像

Python如何将RGB图像转换为Pytho灰度图像?