Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/opencv/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用numpy数组中的opencv生成灰度图像失败_Numpy_Opencv - Fatal编程技术网

使用numpy数组中的opencv生成灰度图像失败

使用numpy数组中的opencv生成灰度图像失败,numpy,opencv,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

我使用下面的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
获取数字(img)中的

6.
7#对图像进行灰度化
---->8灰色=cv2.CVT颜色(img,cv2.COLOR\U BGR2GRAY)
9
10
错误:C:\projects\opencv python\opencv\modules\imgproc\src\color.cpp:11073:错误:(-215)在函数cv::cvtColor中深度==0 | |深度==2 | |深度==5

opencv错误中没有任何信息,无法获取错误信息

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

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有更多用户友好的错误消息,它将真正有助于解决此类问题。

您的图像已经是灰度图像,即黑白有形状(28112)。如果
img
有形状(28112),则它不是彩色BGR图像。它已经是灰色的了。(BGR或RGB将具有形状(28、112、3)。)是的,它是黑白的,但cv2的thredshold函数要求它以某种方式进行灰度化,我如何实现它?好的,现在我将其转换回3通道图像,但仍然得到相同的错误
img=np.stack((img,)*3,-1)img=img.astype(np.float64)img*=1./255打印(img.shape)
现在的形状是
(28112,3)
但仍然
灰色=cv2.cvtColor(img,cv2.COLOR\uBGR2gray)
给出了相同的错误
颜色。cpp:11073:错误:(-215)深度==0 |深度==2 |深度==5函数cv::cvtColor
好的,我们在这里取得了进展:)我将float64改为float32,灰度问题消失了,现在我陷入了阈值问题
img=np.stack((img,)*3,-1)img=img.astype(np.float32)img*=1./255 print(img.shape)plt.imshow(img)#灰度图像灰度化=cv2.cvtColor(img,cv2.COLOR\u BGR2GRAY)#thredshold image thresh=cv2.threshold(灰色,0,255,cv2.thresh_BINARY_INV | cv2.thresh_OTSU)[1]
thresh.cpp:1406:错误:(-215)src.type()=((0)和((1