我目前正在处理图像处理中的第一个任务(在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函数来过滤它们,但是看起来确实不可靠
处理的图像示例:
high resolution version here high resolution version here high resolution version here high resolution version here high resolution version here high resolution version here 截至目前,我对如何进行此工作一无所知。我已经尝试了所有我能想到的。如果你们中的任何图像识别专家给我任何建议,甚至更好的可用代码示例来帮助我解决问题,我将非常高兴。 谢谢大家。
通过自适应二值化和轮廓查找黑盘(可能模糊以擦除内部特征);
使椭圆尽可能地适合轮廓;
找到正方形的至少一条边(霍夫线);
将边缘分类为NWSE之一(根据 Angular );
使用椭圆和线信息重建透视变换(单应性)。
应用反单应性图使图像变直并获得精确的目标中心和轴;
再次通过自适应二值化,找到子弹孔(中心/半径);
在孔距中心的距离(相对于后圆盘半径)之后对孔进行评级。
如果标记方案是可变的,则检测圆(使用已知中心的霍夫圆或从中心开始的倾斜轮廓中的峰)。
如有必要,可以对数字进行OCR,但似乎比分是从外圈中的一开始隐式开始的。