<optgroup id="m04aa"><small id="m04aa"></small></optgroup><center id="m04aa"><wbr id="m04aa"></wbr></center><center id="m04aa"></center>
<optgroup id="m04aa"><small id="m04aa"></small></optgroup>
<noscript id="m04aa"></noscript>
<optgroup id="m04aa"></optgroup>
訂閱
糾錯
加入自媒體

使用CV2和Keras OCR從圖像中刪除文本

2022-03-28 16:16
磐創AI
關注

介紹

本文將討論如何快速地從圖像中刪除文本,作為圖像分類器的預處理步驟。

刪除文本可能有多種或多種原因,例如,我們可以使用無文本圖像進行數據增強。

在本教程中,我們將使用OCR(光學字符識別)檢測圖像中的文本,并在修復過程中填充照片中丟失的部分以生成完整的圖像——以刪除我們檢測到的文本。

處理

為了從圖像中刪除文本,我們將執行以下三個步驟:

1. 識別圖像中的文本,并使用KerasOCR獲取每個文本的邊界框坐標。

2. 對于每個邊界框,應用一個遮罩來告訴算法我們應該修復圖像的哪個部分。

3. 最后,應用一種修復算法對圖像的遮罩區域進行修復,從而得到一個無文本圖像。

實現

Keras ocr簡介

KerasOCR提供現成的ocr模型和端到端訓練管道,以構建新的ocr模型

在這種情況下,我們將使用預訓練的模型,它對我們的任務非常有效。

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應用修復算法時,需要提供兩幅圖像:

1. 輸入圖像,包含我們要刪除的文本。

2. 遮罩圖像,它顯示圖像中要刪除的文本在哪里。第二個圖像的尺寸應與輸入的尺寸相同。

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的修復算法。該算法似乎可以很好地從圖像中快速刪除文本,而無需為此特定任務訓練模型。

當文本框靠近其他對象時,它通常表現不好,因為它可能會扭曲周圍環境。

感謝閱讀!

       原文標題 : 使用CV2和Keras OCR從圖像中刪除文本

聲明: 本文由入駐維科號的作者撰寫,觀點僅代表作者本人,不代表OFweek立場。如有侵權或其他問題,請聯系舉報。

發表評論

0條評論,0人參與

請輸入評論內容...

請輸入評論/評論長度6~500個字

您提交的評論過于頻繁,請輸入驗證碼繼續

暫無評論

暫無評論

人工智能 獵頭職位 更多
掃碼關注公眾號
OFweek人工智能網
獲取更多精彩內容
文章糾錯
x
*文字標題:
*糾錯內容:
聯系郵箱:
*驗 證 碼:

粵公網安備 44030502002758號

太大太粗太爽免费视频
<optgroup id="m04aa"><small id="m04aa"></small></optgroup><center id="m04aa"><wbr id="m04aa"></wbr></center><center id="m04aa"></center>
<optgroup id="m04aa"><small id="m04aa"></small></optgroup>
<noscript id="m04aa"></noscript>
<optgroup id="m04aa"></optgroup>