使用numpy数组中的opencv生成灰度图像失败
我使用下面的numpy数组来保存一个图像,它是具有以下形状的黑白图像使用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
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