繁体   English   中英

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

[英]Not able to convert RGB image to gray scale using scikit image

我曾尝试将 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不处理二进制数组。 根据答案可接受的类型是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))

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM