首页 > 解决方案 > 使用来自 numpy 数组的 opencv 的灰度图像失败

问题描述

我使用以下 numpy 数组来保存具有以下形状的黑白图像

print(img.shape)

(28, 112)

当我尝试对图像进行灰度化时,使用它通过以下步骤使用 opencv 获取轮廓

#grayscale the image
 grayed = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

 #thredshold image
 thresh = cv2.threshold(grayed, 0, 255, cv2.THRESH_BINARY_INV | cv2.THRESH_OTSU)[1]

我收到以下错误

<ipython-input-178-7ebff17d1c18> in get_digits(img)
      6 
      7     #grayscale the image
----> 8     grayed = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
      9 
     10 

error: C:\projects\opencv-python\opencv\modules\imgproc\src\color.cpp:11073: error: (-215) depth == 0 || depth == 2 || depth == 5 in function cv::cvtColor

opencv 错误中没有任何信息可以找出问题所在

标签: numpyopencv

解决方案


这是您如何尝试的工作代码:

img = np.stack((img,) * 3,-1)
img = img.astype(np.uint8)
grayed = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
thresh = cv2.threshold(grayed, 0, 255, cv2.THRESH_BINARY_INV | cv2.THRESH_OTSU)[1]

获得相同结果的更简单方法是自己反转图像:

img = (255-img)
thresh = cv2.threshold(img, 0, 255, cv2.THRESH_OTSU)[1]

正如您所发现的,当您对图像执行不同的操作时,图像需要采用不同的格式。

cv2.THRESH_BINARY_INV 和 cv2.THRESH_BINARY 旨在拍摄彩色图像(并将其转换为灰度),因此您需要三通道表示。

cv2.THRESH_OTSU 适用于灰度图像,因此一个通道就可以了。

由于您的图像从一开始就已经是灰度的,因此您无法将其从彩色转换为灰度,您也不需要这样做。我假设您正在尝试反转图像,但这很容易靠您自己 ( 255-img)。

有一次,您尝试使用浮点值执行 cv2.THRESH_OTSU,但 cv2.THRESH_OTSU 需要 0 到 255 之间的整数。

如果 openCV 有更多用户友好的错误消息,它会真正帮助解决这些问题。


推荐阅读