使用来自numpy数组的opencv的灰度图像失败

时间:2018-06-02 23:06:58

标签: 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错误中没有任何信息可以解决错误

1 个答案:

答案 0 :(得分:3)

以下是您尝试方式的工作代码:

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有更多用户友好的错误消息,那么这些问题确实会有所帮助。