python - 如何找到图像中数字的中心坐标

标签 python opencv image-processing ocr python-tesseract

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

处理后的拍摄目标图像的

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

  • 到目前为止我尝试过的是:
  • 匹配的模板
  • 在这里,我很快意识到这是不可用的,因为数字可能会略微旋转,并且缩放比例不同。

  • 功能匹配
  • 我尝试了所有不同的特征匹配类型(SIFT,SURF,ORB ...)
  • 不幸的是,数字没有特定的功能集,因此它们与很多误报相匹配,但是我可以通过添加形状匹配等来过滤它们。
  • 最大的障碍是运行时,仅单个数字功能匹配的运行时就花费了约5000ms(即使经过优化)(在MacBook Pro 2017上)

  • 光学字符识别
  • 我主要尝试使用 pytesseract
  • 即使将图像阈值化为反转二进制(因此数字7和8的文本为黑色,背景为白色),它也无法识别它们
  • 我还尝试了几种预处理图像的方法,并且使用tesseract config参数发挥了很多作用,但是
  • 似乎无济于事

  • 轮廓检测
  • 我已经轻松地将所有想要的数字(7&8)检测为单个轮廓,但是未能滤除所有误报(因为图像的分辨率可能不同,并且存在两种目标的大小不同)我不能简单地通过轮廓的宽度,高度或面积来限制轮廓的数值)
  • 在我将数字检测为轮廓之后,我想将它们提取为一些ROI,然后在它们上使用OCR(但是由于误报很多,这将需要很多时间)
  • 我也尝试通过在轮廓和裁剪的模板/ ROI上使用cv2.matchShapes函数来过滤它们,但是
  • 看起来确实不可靠


    处理的图像示例:
    1
  • high resolution version here

  • 2
  • high resolution version here

  • 3
  • high resolution version here

  • 4
  • high resolution version here

  • 5
  • high resolution version here

  • 6
  • high resolution version here

  • 截至目前,我对如何进行此工作一无所知。我已经尝试了所有我能想到的。如果你们中的任何图像识别专家给我任何建议,甚至更好的可用代码示例来帮助我解决问题,我将非常高兴。
    谢谢大家。

    最佳答案

  • 通过自适应二值化和轮廓查找黑盘(可能模糊以擦除内部特征);
  • 使椭圆尽可能地适合轮廓;
  • 找到正方形的至少一条边(霍夫线);
  • 将边缘分类为NWSE之一(根据 Angular );
  • 使用椭圆和线信息重建透视变换(单应性)。
  • 应用反单应性图使图像变直并获得精确的目标中心和轴;
  • 再次通过自适应二值化,找到子弹孔(中心/半径);
  • 在孔距中心的距离(相对于后圆盘半径)之后对孔进行评级。

  • 如果标记方案是可变的,则检测圆(使用已知中心的霍夫圆或从中心开始的倾斜轮廓中的峰)。
    如有必要,可以对数字进行OCR,但似乎比分是从外圈中的一开始隐式开始的。

    关于python - 如何找到图像中数字的中心坐标,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63048513/

    相关文章:

    python - 如何在 python 中使用变量名访问数据文件中的变量值(观察值)

    python - 试图理解 __init__.py 结合 getattr

    python - 用列表中的索引替换数组中的值

    python - 是否可以在Python中的drawcontour中为特定区域着色?

    python - JSON 使用 Django 对类建模

    c# - 如何在 Emgu CV 中实现 "rotate-algorithm"?

    括号中的 Python bool 值?

    c++ - 无法执行 Cython 包装的 Python 代码

    c++ - 是否使用 saturate_cast

    python - 在 Python 中将视频中的单个帧存储在数组中