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

介紹
本文將討論如何快速地從圖像中刪除文本,作為圖像分類器的預(yù)處理步驟。
刪除文本可能有多種或多種原因,例如,我們可以使用無文本圖像進行數(shù)據(jù)增強。
在本教程中,我們將使用OCR(光學字符識別)檢測圖像中的文本,并在修復(fù)過程中填充照片中丟失的部分以生成完整的圖像——以刪除我們檢測到的文本。
處理
為了從圖像中刪除文本,我們將執(zhí)行以下三個步驟:
1. 識別圖像中的文本,并使用KerasOCR獲取每個文本的邊界框坐標。
2. 對于每個邊界框,應(yīng)用一個遮罩來告訴算法我們應(yīng)該修復(fù)圖像的哪個部分。
3. 最后,應(yīng)用一種修復(fù)算法對圖像的遮罩區(qū)域進行修復(fù),從而得到一個無文本圖像。

實現(xiàn)
Keras ocr簡介
KerasOCR提供現(xiàn)成的ocr模型和端到端訓練管道,以構(gòu)建新的ocr模型
在這種情況下,我們將使用預(yù)訓練的模型,它對我們的任務(wù)非常有效。
KerasOCR將自動下載探測器和識別器的預(yù)訓練權(quán)重。
當通過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,我們會看到每個元素對應(yīng)一組坐標。
例如,prediction_groups[0][10]如下:
('tuesday',
array([[ 986.2778 , 625.07764],
[1192.3856 , 622.7086 ],
[1192.8888 , 666.4836 ],
[ 986.78094, 668.8526 ]], dtype=float32))
數(shù)組的第一個元素對應(yīng)左上角的坐標,第二個元素對應(yīng)右下角,第三個元素是右上角,而第四個元素是左下角。

cv2修復(fù)函數(shù)
使用OpenCV應(yīng)用修復(fù)算法時,需要提供兩幅圖像:
1. 輸入圖像,包含我們要刪除的文本。
2. 遮罩圖像,它顯示圖像中要刪除的文本在哪里。第二個圖像的尺寸應(yīng)與輸入的尺寸相同。
Cv2具有兩種修復(fù)算法,并允許應(yīng)用矩形、圓形或線遮罩
在這種情況下,我決定使用線遮罩,因為它們更靈活地覆蓋不同方向的文本(矩形遮罩只適用于平行或垂直于x軸的單詞,圓形遮罩將覆蓋比較大的區(qū)域)。
為了應(yīng)用遮罩,我們需要提供線的起點和終點坐標以及線的厚度:
起點將是框的左上角和左下角之間的中點,終點將是右上角和右下角之間的中點。
對于厚度,我們將計算左上角和左下角之間的線長度。
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 ))
現(xiàn)在我們可以創(chuàng)建我們的遮罩:
mask = np.zeros(img.shape[:2], dtype="uint8")
cv2.line(mask, (x_mid0, y_mid0), (x_mid1, y_mi1), 255, thickness)
我們還可以檢查遮罩區(qū)域,確保其正常工作。
masked = cv2.bitwise_and(img, img, mask=mask)
plt.imshow(masked)

最后,我們可以修復(fù)圖像。
在這種情況下,我們將使用cv2.INPAINT_NS,指得是“Navier-Stokes, Fluid Dynamics, and Image and Video Inpainting”一文中描述的修復(fù)算法。
img_inpainted = cv2.inpaint(img, mask, 7, cv2.INPAINT_NS)
plt.imshow(img_inpainted)

正如你所看到的,“Tuesday”已從圖片中刪除。
匯總
現(xiàn)在,讓我們把它總結(jié)起來,創(chuàng)建一個函數(shù)來去除任何圖像中的文本。我們只需要生成框列表,并迭代每個文本框。
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)
以下是最終結(jié)果(之前和之后):

另外兩個例子:


請注意,如果要保存圖像,需要將其轉(zhuǎn)換為RGB格式,否則顏色會反轉(zhuǎn)!
img_rgb = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
cv2.imwrite(‘text_free_image.jpg’,img_rgb)
如果你只對刪除某些單詞感興趣,則可以包括一個if條件,如下所示:
給出了一個要刪除的單詞列表
remove_list = [‘tuesday’, ‘monday’]
我們可以在for循環(huán)中包含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)
當然,這只是一個快速的例子,說明了如何對特定的單詞列表進行修復(fù)。
結(jié)尾
在這篇文章中,我們討論了如何實現(xiàn)一種算法來自動刪除圖像中的文本,該算法使用一個預(yù)訓練好的OCR模型(使用Keras)和一個使用cv2的修復(fù)算法。該算法似乎可以很好地從圖像中快速刪除文本,而無需為此特定任務(wù)訓練模型。
當文本框靠近其他對象時,它通常表現(xiàn)不好,因為它可能會扭曲周圍環(huán)境。
感謝閱讀!
原文標題 : 使用CV2和Keras OCR從圖像中刪除文本
請輸入評論內(nèi)容...
請輸入評論/評論長度6~500個字
最新活動更多
-
11月7日立即參評>> 【評選】維科杯·OFweek 2025(第十屆)物聯(lián)網(wǎng)行業(yè)年度評選
-
11月20日立即報名>> 【免費下載】RISC-V芯片發(fā)展現(xiàn)狀與測試挑戰(zhàn)-白皮書
-
即日-11.25立即下載>>> 費斯托白皮書《柔性:汽車生產(chǎn)未來的關(guān)鍵》
-
11月27日立即報名>> 【工程師系列】汽車電子技術(shù)在線大會
-
11月28日立即下載>> 【白皮書】精準洞察 無線掌控——283FC智能自檢萬用表
-
12月18日立即報名>> 【線下會議】OFweek 2025(第十屆)物聯(lián)網(wǎng)產(chǎn)業(yè)大會
推薦專題
- 1 特斯拉工人被故障機器人打成重傷,索賠3.6億
- 2 AI 時代,阿里云想當“安卓” ,那誰是“蘋果”?
- 3 拐點已至!匯川領(lǐng)跑工控、埃斯頓份額第一、新時達海爾賦能扭虧為盈
- 4 L3自動駕駛延期,逼出車企技術(shù)自我淘汰
- 5 隱退4年后,張一鳴久違現(xiàn)身!互聯(lián)網(wǎng)大佬正集體殺回
- 6 機器人9月大事件|3家國產(chǎn)機器人沖刺IPO,行業(yè)交付與融資再創(chuàng)新高!
- 7 谷歌“香蕉”爆火啟示:國產(chǎn)垂類AI的危機還是轉(zhuǎn)機?
- 8 7倍機器人大牛股:高管股東套現(xiàn)VS機構(gòu)兇猛抱團,該信誰?
- 9 八部門聯(lián)手放行L3自動駕駛!巨頭開始拼搶萬億市場?
- 10 OpenAI發(fā)布的AI瀏覽器,市場為何反應(yīng)強烈?
- 高級軟件工程師 廣東省/深圳市
- 自動化高級工程師 廣東省/深圳市
- 光器件研發(fā)工程師 福建省/福州市
- 銷售總監(jiān)(光器件) 北京市/海淀區(qū)
- 激光器高級銷售經(jīng)理 上海市/虹口區(qū)
- 光器件物理工程師 北京市/海淀區(qū)
- 激光研發(fā)工程師 北京市/昌平區(qū)
- 技術(shù)專家 廣東省/江門市
- 封裝工程師 北京市/海淀區(qū)
- 結(jié)構(gòu)工程師 廣東省/深圳市


分享













