使用CV2和Keras OCR从图像中删除文本-600学习网
600学习网终身会员188,所有资源无秘无压缩-购买会员
介绍
本文将讨论如何从图像中快速删除文本作为图像分类器的预处理步骤。
删除文本可能有很多或更多的原因。例如,我们可以使用无文本图像进行数据增强。
在本教程中,我们将使用OCR(光学字符识别)检测图像中的文本,并在修复过程中填充照片的缺失部分,以生成完整的图像-删除我们检测到的文本。
手柄
要从图像中删除文本,我们将执行以下三个步骤:
1.识别图像中的文本,并使用KerasOCR获取每个文本的边界框坐标。
2.对于每个边界框,应用一个遮罩来告诉算法我们应该修复图像的哪个部分。
3.最后,应用修复算法对图像的掩模区域进行修复,以获得无文本图像。
实现
Keras ocr简介
KerasOCR提供现成的ocr模型和端到端培训渠道,以构建新的ocr模式
在这种情况下,我们将使用预先训练的模型,这对我们的任务非常有效。
KerasOCR将自动下载检测器和识别器的预训练权重。
当图像通过Keras orc传输时,它将返回一个元组(单词,框),其中框包含四个角的坐标(x,y)。
下面是一个简单的例子:
将matplotlib.pyplot导入为plt
进口keras_ocr
pipeline=keras_ocr.pipeline。pipeline()
#从图像路径(jpg/png文件或图像url)读取图像
img=keras_ocr.tools.read(图像_路径)
#预测_组是(单词,方框)元组的列表
预测_组=管道识别(〔img〕)
#打印带有注释和方框的图像
keras_ocr.tools.drawAnnotations(图像=img,预测=预测_组[0])
如果我们查看prediction_groups,我们将看到每个元素对应于一组坐标。
例如,prediction_groups[0][10]如下所示:
(“星期二”
数组(〔986.2778,625.07764〕
[1192.3856 , 622.7086 ],
[1192.8888 , 666.4836 ],
〔986.78094,668.8526〕〕,dtype=float32))
数组的第一个元素对应左上角的坐标,第二个元素对应右下角,第三个元素是右上角,第四个元素是左下角。
Cv2修复功能
使用OpenCV应用修复算法时,需要提供两个图像:
1.输入包含要删除的文本的图像。
2.屏蔽图像,显示图像中要删除的文本的位置。第二个图像的大小应与输入的大小相同。
Cv2有两种修复算法,允许应用矩形.圆形或线条掩码
在这种情况下,我决定使用行掩码,因为它们在覆盖不同方向的文本时更灵活(矩形掩码仅适用于与x轴平行或垂直的单词,而圆形掩码将覆盖更大的区域)。
为了应用遮罩,我们需要提供线条的起点和终点坐标以及线条的粗细:
起点将是方框左上角和左下角之间的中点,终点将是方框右上角和右下角的中点。
对于厚度,我们将计算左上角和左下角之间的线条长度。
导入数学
将numpy导入为np
定义中点(x1,y1,x2,y2):
x_mid=int((x1+x2)/2)
y_mid=int((y1+y2)/2)
返回(x_mid,y_mid)
#单词”星期二”的行掩码示例
框=预测_组[0][10]
x0,y0=框[1][0]
x1,y1=框[1][1]
x2,y2=框[1][2]
x3,y3=框[1][3]
x_mid0,y_mid0=中点(x1,y1,x2,y2)
x_mid1,y_mi1=中点(x0,y0,x3,y3)
厚度=int(math.sqrt((x2-x1)**2+(y2-y1)*2))
现在我们可以创建掩码:
掩码=np.零(img.shape〔:2〕,dtype=”uint8″)
cv2.line(掩码,(x_mid0,y_mid1),(x_2mid1,y_mi1),255,厚度)
我们还可以检查遮罩区域以确保其正常工作。
掩码=cv2.bitwise_和(img,img,mask=掩码)
plt.imshow(屏蔽)
最后,我们可以修复图像。
在这种情况下,我们将使用cv2.INPAINT_NS,它是指文章”Navier-Stokes,流体动力学,图像和视频内画”中描述的修复算法。
img_inpainted=cv2.inpaint(img,mask,7,cv2.inpaint_NS)
plt.imshow(img_inpainted)
如您所见,”星期二”已从图片中删除。
总结
现在,让我们总结一下,并创建一个函数来从任何图像中删除文本。我们只需要生成一个框列表并遍历每个文本框。
将matplotlib.pyplot导入为plt
进口keras_ocr
导入cv2
导入数学
将numpy导入为np
定义中点(x1,y1,x2,y2):
x_mid=int((x1+x2)/2)
y_mid=int((y1+y2)/2)
返回(x_mid,y_mid)
pipeline=keras_ocr.pipeline。pipeline()
def inpaint _ text(img _ path,pipeline):
#读取图像
img=keras_ocr.tools.read(img_路径)
#生成(字,框)元组
预测_组=管道识别(〔img〕)
掩码=np.零(img.shape〔:2〕,dtype=”uint8″)
对于预测框_组[0]:
x0,y0=框[1][0]
x1,y1=框[1][1]
x2,y2=框[1][2]
x3,y3=框[1][3]
x_mid0,y_mid0=中点(x1,y1,x2,y2)
x_mid1,y_mi1=中点(x0,y0,x3,y3)
厚度=int(math.sqrt((x2-x1)**2+(y2-y1)*2))
cv2.line(掩码,(x_mid0,y_mid1),(x_2mid1,y_mi1),255,厚度)
img=cv2.inpaint(img,mask,7,cv2.inpaint _ NS)
返回(img)
以下是最终结果(前后):
另外两个例子:
请注意,如果您想保存图像,需要将其转换为RGB格式,否则颜涩将反转!
img_rgb=cv2.cvt颜涩(img,cv2.COLOR_BGR2RGB)
cv2.imwrite(文本免费图片.jpg,img rgb)
如果您只想删除一些单词,可以包括If条件,如下所示:
提供要删除的单词列表
删除_列表=〔星期二.星期一〕
我们可以在for循环中包含if条件
def inpaint_text(img_path,remove_list,pipeline):
#读取图像
img=keras_ocr.tools.read(img_路径)
#生成(字,框)元组
预测_组=管道识别(〔img〕)
掩码=np.零(img.shape〔:2〕,dtype=”uint8″)
对于预测框_组[0]:
如果删除_列表中的框[0]:
x0,y0=框[1][0]
x1,y1=框[1][1]
x2,y2=框[1][2]
x3,y3=框[1][3]
x_mid0,y_mid0=中点(x1,y1,x2,y2)
x_mid1,y_mi1=中点(x0,y0,x3,y3)
厚度=int(math.sqrt((x2-x1)**2+(y2-y1)*2))
cv2.line(掩码,(x_mid0,y_mid1),(x_2mid1,y_mi1),255,厚度)
img=cv2.inpaint(img,mask,7,cv2.inpaint _ NS)
返回(img)
当然,这只是一个如何修复特定单词列表的快速示例。
结尾
在本文中,我们讨论了如何实现一种自动从图像中删除文本的算法,该算法使用预先训练的OCR模型(使用Keras)和使用cv2的修复算法。该算法似乎能够在没有训练模型的情况下从图像中快速删除文本。
当文本框靠近其他对象时,它通常表现不好,因为它可能会扭曲周围的环境。
谢谢你的阅读!
600学习网 » 使用CV2和Keras OCR从图像中删除文本-600学习网