Python使用Keras OCR实现从图像中删除文本

目录
  • 介绍
  • 处理
  • 实现
    • Keras ocr简介
    • cv2修复函数
  • 汇总
  • 结尾

介绍

本文将讨论如何快速地从图像中删除文本,作为图像分类器的预处理步骤。

删除文本可能有多种或多种原因,例如,我们可以使用无文本图像进行数据增强。

在本教程中,我们将使用OCR(光学字符识别)检测图像中的文本,并在修复过程中填充照片中丢失的部分以生成完整的图像——以删除我们检测到的文本。

处理

为了从图像中删除文本,我们将执行以下三个步骤:

1.识别图像中的文本,并使用KerasOCR获取每个文本的边界框坐标。

2.对于每个边界框,应用一个遮罩来告诉算法我们应该修复图像的哪个部分。

3.最后,应用一种修复算法对图像的遮罩区域进行修复,从而得到一个无文本图像。

实现

Keras ocr简介

KerasOCR提供现成的ocr模型和端到端训练管道,以构建新的ocr模型(请参见:https://keras-ocr.readthedocs.io/en/latest/).

在这种情况下,我们将使用预训练的模型,它对我们的任务非常有效。

KerasOCR将自动下载探测器和识别器的预训练权重。

当通过Keras orc传递图像时,它将返回一个(word,box)元组,其中框包含四个角的坐标(x,y)。

下面是一个快速示例:

import matplotlib.pyplot as plt
import keras_ocr

pipeline = keras_ocr.pipeline.Pipeline()

#read image from the an image path (a jpg/png file or an image url)
img = keras_ocr.tools.read(image_path)

# Prediction_groups is a list of (word, box) tuples
prediction_groups = pipeline.recognize([img])

#print image with annotation and boxes
keras_ocr.tools.drawAnnotations(image=img, predictions=prediction_groups[0])

如果我们看一下prediction_groups,我们会看到每个元素对应一组坐标。

例如,prediction_groups[0][10]如下:

('tuesday',
 array([[ 986.2778 ,  625.07764],
        [1192.3856 ,  622.7086 ],
        [1192.8888 ,  666.4836 ],
        [ 986.78094,  668.8526 ]], dtype=float32))

数组的第一个元素对应左上角的坐标,第二个元素对应右下角,第三个元素是右上角,而第四个元素是左下角。

cv2修复函数

使用OpenCV应用修复算法时,需要提供两幅图像:

输入图像,包含我们要删除的文本。

遮罩图像,它显示图像中要删除的文本在哪里。第二个图像的尺寸应与输入的尺寸相同。

Cv2具有两种修复算法,并允许应用矩形、圆形或线遮罩(请参考)

在这种情况下,我决定使用线遮罩,因为它们更灵活地覆盖不同方向的文本(矩形遮罩只适用于平行或垂直于x轴的单词,圆形遮罩将覆盖比较大的区域)。

为了应用遮罩,我们需要提供线的起点和终点坐标以及线的厚度:

起点将是框的左上角和左下角之间的中点,终点将是右上角和右下角之间的中点。

对于厚度,我们将计算左上角和左下角之间的线长度。

import math
import numpy as np

def midpoint(x1, y1, x2, y2):
    x_mid = int((x1 + x2)/2)
    y_mid = int((y1 + y2)/2)
    return (x_mid, y_mid)

#example of a line mask for the word "Tuesday"
box = prediction_groups[0][10]
x0, y0 = box[1][0]
x1, y1 = box[1][1]
x2, y2 = box[1][2]
x3, y3 = box[1][3]
x_mid0, y_mid0 = midpoint(x1, y1, x2, y2)
x_mid1, y_mi1 = midpoint(x0, y0, x3, y3)
thickness = int(math.sqrt( (x2 - x1)**2 + (y2 - y1)**2 ))

现在我们可以创建我们的遮罩:

mask = np.zeros(img.shape[:2], dtype="uint8")
cv2.line(mask, (x_mid0, y_mid0), (x_mid1, y_mi1), 255, thickness)

我们还可以检查遮罩区域,确保其正常工作。

masked = cv2.bitwise_and(img, img, mask=mask)
plt.imshow(masked)

最后,我们可以修复图像。

在这种情况下,我们将使用cv2.INPAINT_NS,指得是“Navier-Stokes, Fluid Dynamics, and Image and Video Inpainting”一文中描述的修复算法。

img_inpainted = cv2.inpaint(img, mask, 7, cv2.INPAINT_NS)
plt.imshow(img_inpainted)

正如你所看到的,“Tuesday”已从图片中删除。

汇总

现在,让我们把它总结起来,创建一个函数来去除任何图像中的文本。

我们只需要生成框列表,并迭代每个文本框。

import matplotlib.pyplot as plt
import keras_ocr
import cv2
import math
import numpy as np

def midpoint(x1, y1, x2, y2):

    x_mid = int((x1 + x2)/2)
    y_mid = int((y1 + y2)/2)

    return (x_mid, y_mid)

pipeline = keras_ocr.pipeline.Pipeline()

def inpaint_text(img_path, pipeline):

    # read image
    img = keras_ocr.tools.read(img_path)

    # generate (word, box) tuples
    prediction_groups = pipeline.recognize([img])
    mask = np.zeros(img.shape[:2], dtype="uint8")

    for box in prediction_groups[0]:

        x0, y0 = box[1][0]
        x1, y1 = box[1][1]
        x2, y2 = box[1][2]
        x3, y3 = box[1][3] 

        x_mid0, y_mid0 = midpoint(x1, y1, x2, y2)
        x_mid1, y_mi1 = midpoint(x0, y0, x3, y3)
        thickness = int(math.sqrt( (x2 - x1)**2 + (y2 - y1)**2 ))
        cv2.line(mask, (x_mid0, y_mid0), (x_mid1, y_mi1), 255, thickness)
        img = cv2.inpaint(img, mask, 7, cv2.INPAINT_NS)

    return(img)

以下是最终结果(之前和之后):

另外两个例子:

请注意,如果要保存图像,需要将其转换为RGB格式,否则颜色会反转!

img_rgb = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
cv2.imwrite(‘text_free_image.jpg',img_rgb)

如果你只对删除某些单词感兴趣,则可以包括一个if条件,如下所示:

给出了一个要删除的单词列表

remove_list = [‘tuesday', ‘monday']

我们可以在for循环中包含if条件

def inpaint_text(img_path, remove_list, pipeline):

    # read image
    img = keras_ocr.tools.read(img_path)

    # generate (word, box) tuples
    prediction_groups = pipeline.recognize([img])
    mask = np.zeros(img.shape[:2], dtype="uint8")

    for box in prediction_groups[0]:

        if box[0] in remove_list:
           x0, y0 = box[1][0]
           x1, y1 = box[1][1]
           x2, y2 = box[1][2]
           x3, y3 = box[1][3] 

           x_mid0, y_mid0 = midpoint(x1, y1, x2, y2)

           x_mid1, y_mi1 = midpoint(x0, y0, x3, y3)

           thickness = int(math.sqrt( (x2 - x1)**2 + (y2 - y1)**2 ))

           cv2.line(mask, (x_mid0, y_mid0), (x_mid1, y_mi1), 255,
           thickness)

           img = cv2.inpaint(img, mask, 7, cv2.INPAINT_NS)

    return(img)

当然,这只是一个快速的例子,说明了如何对特定的单词列表进行修复。

结尾

在这篇文章中,我们讨论了如何实现一种算法来自动删除图像中的文本,该算法使用一个预训练好的OCR模型(使用Keras)和一个使用cv2的修复算法。该算法似乎可以很好地从图像中快速删除文本,而无需为此特定任务训练模型。

当文本框靠近其他对象时,它通常表现不好,因为它可能会扭曲周围环境。

以上就是Python使用Keras OCR实现从图像中删除文本的详细内容,更多关于Python图像删除文本的资料请关注我们其它相关文章!

(0)

相关推荐

  • python提取图像的名字*.jpg到txt文本的方法

    如下所示: <span style="font-size:18px;"># -*- coding:utf-8 -*- import sys sys.path.append('E:\\Anaconda\\libs') import os #os:操作系统相关的信息模块 import random #导入随机函数 #存放原始图片地址 data_base_dir = "C:\\Users\\Administrator.MICROSO-1HCAN56\\Desktop\\

  • Python提取PDF内容的方法(文本、图像、线条等)

    1.安装PDFminer3k 使用pip 命令安装 pip install pdfminer3k 2.编写测试 你可以在这里获得官方参考:PDFMiner 如果你不喜欢看英文的官方文档,这里的翻译也许对你有帮助:中文PDFMiner文档 下面的程序,我拓展了官方给出的例子,你可以通过这个例子统计出来你的pdf文件一共包含哪些内容,比如文本框,曲线,图片等 #!/usr/bin/python # -*- coding: utf-8 -*- __author__ = 'yooongchun' imp

  • Python 删除整个文本中的空格,并实现按行显示

    希望以后每天写一篇博客,总结一下每天用到的基本功能,不然项目做完也就做完了,给自己留下的资料太少了. 今天需要造大量的姓名和家庭住址的数据,因此根据读取文件中现有的lastname.firstname以及省.市.道路等随机生成大量的模拟姓名和住址.其中用python进行了简单的文本处理,去掉文本中的空格,数字或者没用的字符等. example 1: 从ifn文件中读取数据,根据空格进行逐个读取,并进行换行显示. #encoding = utf-8# ifn = r"firstname.txt&q

  • python删除文本中行数标签的方法

    问题描述: 我们在网上下载或者复制别人代码的时候经常会遇到下载的代码中包含行数标签的情况.如下图: 这些代码中包含着行数如1.,2.等,如果我们想直接运行或者copy代码需要自己手动的删除这些标签.既然学了python,我们写一段脚本来处理它吧. 思路分析: 首先,我们逐行的读取文本. 利用正则表达式,可以顺利地匹配出所有的这些标签以及后面跟随的"\t",正则表达式为:"\d+.\t". 接着我们将匹配的结果在这一行中删除它,使用string模块的replace方法

  • Python使用Keras OCR实现从图像中删除文本

    目录 介绍 处理 实现 Keras ocr简介 cv2修复函数 汇总 结尾 介绍 本文将讨论如何快速地从图像中删除文本,作为图像分类器的预处理步骤. 删除文本可能有多种或多种原因,例如,我们可以使用无文本图像进行数据增强. 在本教程中,我们将使用OCR(光学字符识别)检测图像中的文本,并在修复过程中填充照片中丢失的部分以生成完整的图像——以删除我们检测到的文本. 处理 为了从图像中删除文本,我们将执行以下三个步骤: 1.识别图像中的文本,并使用KerasOCR获取每个文本的边界框坐标. 2.对于

  • Linux 中删除文本中的回车字符的方法

    当回车字符(Ctrl+M)让你紧张时,别担心.有几种简单的方法消除它们. "回车"字符可以往回追溯很长一段时间 -- 早在打字机上就有一个机械装置或杠杆将承载纸滚筒的机架移到右边,以便可以重新在左侧输入字母.他们在 Windows 上的文本文件上保留了它,但从未在 Linux 系统上使用过.当你尝试在 Linux 上处理在 Windows 上创建的文件时,这种不兼容性有时会导致问题,但这是一个非常容易解决的问题. 如果你使用 od(八进制转储octal dump)命令查看文件,那么回车

  • Keras 在fit_generator训练方式中加入图像random_crop操作

    使用Keras作前端写网络时,由于训练图像尺寸较大,需要做类似 tf.random_crop 图像裁剪操作. 为此研究了一番Keras下已封装的API. Data Augmentation(数据扩充) Data Aumentation 指使用下面或其他方法增加输入数据量.我们默认图像数据. 旋转&反射变换(Rotation/reflection): 随机旋转图像一定角度; 改变图像内容的朝向; 翻转变换(flip): 沿着水平或者垂直方向翻转图像; 缩放变换(zoom): 按照一定的比例放大或者

  • Python图像处理之识别图像中的文字(实例讲解)

    ①安装PIL:pip install Pillow(之前的博客中有写过) ②安装pytesser3:pip install pytesser3 ③安装pytesseract:pip install pytesseract ④安装autopy3: 先安装wheel:pip install wheel 下载autopy3-0.51.1-cp36-cp36m-win_amd64.whl[点击打开链接] 执行命令:pip install E:\360安全浏览器下载\autopy3-0.51.1-cp36

  • 使用Python和OpenCV检测图像中的物体并将物体裁剪下来

    介绍 硕士阶段的毕设是关于昆虫图像分类的,代码写到一半,上周五导师又给我新的昆虫图片数据集了,新图片中很多图片很大,但是图片中的昆虫却很小,所以我就想着先处理一下图片,把图片中的昆虫裁剪下来,这样除去大部分无关背景,应该可以提高识别率. 原图片举例(将红色矩形框部分裁剪出来)): step1:加载图片,转成灰度图 image = cv2.imread("353.jpg") gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) step2:用Sob

  • python opencv 找出图像中的最大轮廓并填充(生成mask)

    本文主要介绍了python opencv 找出图像中的最大轮廓并填充,分享给大家,具体如下: import cv2 import numpy as np from PIL import Image from joblib import Parallel from joblib import delayed # Parallel 和 delayed是为了使用多线程处理 # 使用前需要安装joblib:pip install joblib # img_stack的shape为:num, h, w #

  • Python OpenCV基于霍夫圈变换算法检测图像中的圆形

    目录 第一章:霍夫变换检测圆 ① 实例演示1 ② 实例演示2 ③ 霍夫变换函数解析 第二章:Python + opencv 完整检测代码 ① 源代码 ② 运行效果图 第一章:霍夫变换检测圆 ① 实例演示1 这个是设定半径范围 0-50 后的效果. ② 实例演示2 这个是设定半径范围 50-70 后的效果,因为原图稍微大一点,半径也大了一些. ③ 霍夫变换函数解析 cv.HoughCircles() 方法 参数分别为:image.method.dp.minDist.param1.param2.mi

  • Python实现识别图像中人物的示例代码

    目录 前言 环境部署 代码 总结 前言 接着上一篇:AI识别照片是谁,人脸识别face_recognition开源项目安装使用 根据项目提供的demo代码,调整了一下功能,自己写了一个识别人脸的工具代码. 环境部署 按照上一篇的安装部署就可以了. 代码 不废话,直接上代码. #!/user/bin/env python # coding=utf-8 """ @project : face_recognition @author : 剑客阿良_ALiang @file : te

  • 详解如何使用Python隐藏图像中的数据

    目录 编码 例子 解码 程序执行 局限性 参考 隐写术是在任何文件中隐藏秘密数据的艺术. 秘密数据可以是任何格式的数据,如文本甚至文件.简而言之,隐写术的主要目的是隐藏任何文件(通常是图像.音频或视频)中的预期信息,而不实际改变文件的外观,即文件外观看起来和以前一样. 在这篇文章中,我们将重点学习基于图像的隐写术,即在图像中隐藏秘密数据. 但在深入研究之前,让我们先看看图像由什么组成: 1.像素是图像的组成部分. 2.每个像素包含三个值:(红色.绿色.蓝色)也称为 RGB 值. 3.每个 RGB

  • Python实现随机从图像中获取多个patch

    经常有一些图像任务需要从一张大图中截取固定大小的patch来进行训练.这里面常常存在下面几个问题: patch的位置尽可能随机,不然数据丰富性可能不够,容易引起过拟合 如果原图较大,读图带来的IO开销可能会非常大,影响训练速度,所以最好一次能够截取多个patch 我们经常不太希望因为随机性的存在而使得图像中某些区域没有被覆盖到,所以还需要注意patch位置的覆盖程度 基于以上问题,我们可以使用下面的策略从图像中获取位置随机的多个patch: 以固定的stride获取所有patch的左上角坐标 对

随机推荐