无法使用 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 的回答,可接受的类型是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()
【讨论】:
以上是关于无法使用 scikit 图像将 RGB 图像转换为灰度的主要内容,如果未能解决你的问题,请参考以下文章
python库skimage 将针对灰度图像的滤波器用于RGB图像 逐通道滤波;转换为HSV图像滤波