【发布时间】:2020-11-12 20:10:24
【问题描述】:
我目前正在处理我的第一个图像处理任务(在 Python 中使用 OpenCV)。我的任务是计算用户上传的图像中一到几个射击孔的精确分数(精确到十分之一分)。要求之一是将上传的拍摄目标图像转换为“鸟瞰图”以进行进一步处理。 为此,我决定我需要找到数字 (7 & 8) 的中心坐标来选择它们作为我的 4 四边形。
很遗憾,有几个限制需要考虑。
限制:
- 处理后的拍摄目标图像的分辨率可能会有所不同
- 图像可以在不同的光照条件下拍摄
- 我的这部分算法处理的图像将始终在一个角度下拍摄(极端角度将被自动拒绝)
- 图像可以稍微旋转(+/- 10 度)
- 拍摄目标可以只是图像的一部分
- 图像只能是目标的中心黑色部分,这意味着用户不必为整个射击目标拍照(但始终必须有中心黑色部分)
- 此算法最长可运行 2000 毫秒
到目前为止我所做的尝试:
-
模板匹配
- 在这里,我很快意识到它无法使用,因为数字可能会稍微旋转和不同的比例
-
特征匹配
- 我已经尝试了所有不同的特征匹配类型(SIFT、SURF、ORB...)
- 不幸的是,这些数字没有特定的一组特征,因此它们匹配了很多误报,但我可以通过添加形状匹配等来过滤它们。
- 最大的障碍是运行时间,仅单个数字特征匹配的运行时间大约需要 5000 毫秒(即使经过优化)(在 MacBook PRO 2017 上)
-
光学字符识别
- 我主要尝试使用 pytesseract 库
- 即使在将图像阈值化为倒置二进制(因此数字 7 和 8 的文本为黑色,背景为白色)后,它也无法识别它们
- 我还尝试了几种预处理图像的方法,我在 tesseract 配置参数上玩了很多,但它似乎没有任何帮助
-
轮廓检测
- 我很容易将所有想要的数字(7 和 8)检测为单个轮廓,但未能过滤掉所有误报(因为图像可以具有不同的分辨率,并且有两种不同大小的目标我不能简单地通过宽度、高度或面积来确定轮廓的阈值)
- 在将数字检测为轮廓后,我想将它们提取为一些 ROI,然后对它们使用 OCR(但由于误报太多,这将花费大量时间)
- 我还尝试使用 cv2.matchShapes 函数对轮廓和裁剪的模板/ROI 进行过滤,但它似乎真的不可靠
处理后的图像示例:
截至目前,我不知道如何在这方面取得进展。我已经尝试了我能想到的一切。如果你们中的任何图像识别专家给我任何建议,甚至更好的可用代码示例来帮助我解决我的问题,我将非常高兴。
提前谢谢大家。
【问题讨论】:
-
您需要处理的图像是否像您的示例一样?它们非常歪斜并且照明不佳-
-
@user3184950 图像通常具有更好的照明/整体质量。但是很多用户会上传这样的图片,所以我在这里发布了质量好坏的例子。
-
你想多久再问一次同样的问题?你已经问过这个问题两次并删除了(How to warp perspective of whole image by its part)。你都尝试了些什么?你能显示一些代码吗?
-
说实话,我没有不止一次地问过同样的问题。您链接的问题是关于透视变换的完整过程,而这个问题是关于检测图像中的某些数字。我专门删除了这个问题,因为我打开了这个加号,我觉得没有任何信息可以从中获得任何信息。到目前为止,我已经尝试了我在问题正文中描述的所有内容。我也可以肯定地提供一些我的代码,但我觉得它没有任何用处,因为我的方法可能存在问题而不是代码。
标签: python opencv image-processing ocr python-tesseract