【问题标题】:How to find center coordinates of numbers in an image如何在图像中找到数字的中心坐标
【发布时间】:2020-11-12 20:10:24
【问题描述】:

我目前正在处理我的第一个图像处理任务(在 Python 中使用 OpenCV)。我的任务是计算用户上传的图像中一到几个射击孔的精确分数(精确到十分之一分)。要求之一是将上传的拍摄目标图像转换为“鸟瞰图”以进行进一步处理。 为此,我决定我需要找到数字 (7 & 8) 的中心坐标来选择它们作为我的 4 四边形。

很遗憾,有几个限制需要考虑。

限制:

  • 处理后的拍摄目标图像的分辨率可能会有所不同
  • 图像可以在不同的光照条件下拍摄
  • 我的这部分算法处理的图像将始终在一个角度下拍摄(极端角度将被自动拒绝)
  • 图像可以稍微旋转(+/- 10 度)
  • 拍摄目标可以只是图像的一部分
  • 图像只能是目标的中心黑色部分,这意味着用户不必为整个射击目标拍照(但始终必须有中心黑色部分)
  • 此算法最长可运行 2000 毫秒

到目前为止我所做的尝试:

  1. 模板匹配
    • 在这里,我很快意识到它无法使用,因为数字可能会稍微旋转和不同的比例
  2. 特征匹配
    • 我已经尝试了所有不同的特征匹配类型(SIFT、SURF、ORB...)
    • 不幸的是,这些数字没有特定的一组特征,因此它们匹配了很多误报,但我可以通过添加形状匹配等来过滤它们。
    • 最大的障碍是运行时间,仅单个数字特征匹配的运行时间大约需要 5000 毫秒(即使经过优化)(在 MacBook PRO 2017 上)
  3. 光学字符识别
    • 我主要尝试使用 pytesseract
    • 即使在将图像阈值化为倒置二进制(因此数字 7 和 8 的文本为黑色,背景为白色)后,它也无法识别它们
    • 我还尝试了几种预处理图像的方法,我在 tesseract 配置参数上玩了很多,但它似乎没有任何帮助
  4. 轮廓检测
    • 我很容易将所有想要的数字(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


【解决方案1】:
  • 通过自适应二值化和轮廓找到黑盘(可能模糊抹掉内部特征);

  • 使椭圆适合轮廓,尽可能准确;

  • 找到正方形的至少一条边(霍夫线);

  • 将边缘分类为 NWSE 之一(根据角度);

  • 利用椭圆和线信息重构透视变换(是单应性);

  • 应用逆单应性对图像进行拉直,得到准确的目标中心和轴;

  • 再次通过自适应二值化,找到弹孔(中心/半径);

  • 根据孔到中心的距离(相对于背面圆盘半径)对孔进行评分。

如果标记方案是可变的,则检测圆(霍夫圆,使用已知中心,或检测从中心开始的倾斜轮廓中的峰)。

如有必要,您可以对数字进行 OCR,但似乎分数隐含地从外环中的 1 开始。

【讨论】:

  • 感谢您的回答。我拥有步骤 1、2、6、7 和 8 的所有内容。但我不太了解步骤 3、4、5。“找到至少一个带有霍夫线的正方形边缘”是什么意思?您是指围绕椭圆旋转的最小区域矩形的一侧吗?然后我应该从这条线上选择什么点作为我的四边形,我如何计算它在转换图像中的新位置?还是您所说的“线路信息”是指其他意思?很抱歉,但正如我所说,我是图像处理的初学者。你能提供一些基本的代码示例吗?
  • @JakubS:不,我的意思是目标的一侧。得到直线的方程。
  • 哦,不幸的是,这并不总是可能的:/。用户只能上传目标黑色中心部分的照片。因此,有时完整的射击目标没有侧面。关于如何解决这个问题的任何其他想法?
  • @JakubS:找到数字,将它们链接到“重建”两个轴并找到中心。
  • 嗯,这正是我想要做的,但我找不到数字。你能想出任何方法来做到这一点(除了我已经尝试过并在我的问题中解释过的方法)?
猜你喜欢
  • 1970-01-01
  • 2019-05-03
  • 2022-01-26
  • 1970-01-01
  • 2019-06-29
  • 2021-08-11
  • 1970-01-01
  • 2016-12-26
  • 1970-01-01
相关资源
最近更新 更多