numpy - 使用来自 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 错误中没有任何信息可以找出问题所在
解决方案
这是您如何尝试的工作代码:
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 有更多用户友好的错误消息,它会真正帮助解决这些问题。
推荐阅读
- assembly - 将 ARM 汇编指令编码为 ARM 机器语言
- r - 如何从 GAM 中提取和修改单个 p.table 组件适合 R
- .net - 模型类和数据类有什么区别?
- vue.js - 动态组件的 Vue 转换
- python - 随机整数读取和写入文件。尝试使用范围 0,501 创建多个函数
- c# - 您如何从剃刀视图页面引用外键?
- excel - Excel - 直接 excel 公式计算 2 个数组 x 和 y 与平均值的偏差乘积之和(无平方)
- javascript - 使用 NPM 将 Bootstrap 添加到项目时,如何让 bootstrap.js、jquery 和 popper.js 工作?
- c - 从C中的二进制文件中删除结构
- amazon-web-services - 使用 Boto3 通过 AWS SNS 通知发送图像