Python使用Keras OCR實(shí)現(xiàn)從圖像中刪除文本
介紹
本文將討論如何快速地從圖像中刪除文本,作為圖像分類器的預(yù)處理步驟。
刪除文本可能有多種或多種原因,例如,我們可以使用無(wú)文本圖像進(jìn)行數(shù)據(jù)增強(qiáng)。
在本教程中,我們將使用OCR(光學(xué)字符識(shí)別)檢測(cè)圖像中的文本,并在修復(fù)過(guò)程中填充照片中丟失的部分以生成完整的圖像——以刪除我們檢測(cè)到的文本。
處理
為了從圖像中刪除文本,我們將執(zhí)行以下三個(gè)步驟:
1.識(shí)別圖像中的文本,并使用KerasOCR獲取每個(gè)文本的邊界框坐標(biāo)。
2.對(duì)于每個(gè)邊界框,應(yīng)用一個(gè)遮罩來(lái)告訴算法我們應(yīng)該修復(fù)圖像的哪個(gè)部分。
3.最后,應(yīng)用一種修復(fù)算法對(duì)圖像的遮罩區(qū)域進(jìn)行修復(fù),從而得到一個(gè)無(wú)文本圖像。
實(shí)現(xiàn)
Keras ocr簡(jiǎn)介
KerasOCR提供現(xiàn)成的ocr模型和端到端訓(xùn)練管道,以構(gòu)建新的ocr模型(請(qǐng)參見(jiàn):https://keras-ocr.readthedocs.io/en/latest/).
在這種情況下,我們將使用預(yù)訓(xùn)練的模型,它對(duì)我們的任務(wù)非常有效。
KerasOCR將自動(dòng)下載探測(cè)器和識(shí)別器的預(yù)訓(xùn)練權(quán)重。
當(dāng)通過(guò)Keras orc傳遞圖像時(shí),它將返回一個(gè)(word,box)元組,其中框包含四個(gè)角的坐標(biāo)(x,y)。
下面是一個(gè)快速示例:
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,我們會(huì)看到每個(gè)元素對(duì)應(yīng)一組坐標(biāo)。
例如,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ù)組的第一個(gè)元素對(duì)應(yīng)左上角的坐標(biāo),第二個(gè)元素對(duì)應(yīng)右下角,第三個(gè)元素是右上角,而第四個(gè)元素是左下角。
cv2修復(fù)函數(shù)
使用OpenCV應(yīng)用修復(fù)算法時(shí),需要提供兩幅圖像:
輸入圖像,包含我們要?jiǎng)h除的文本。
遮罩圖像,它顯示圖像中要?jiǎng)h除的文本在哪里。第二個(gè)圖像的尺寸應(yīng)與輸入的尺寸相同。
Cv2具有兩種修復(fù)算法,并允許應(yīng)用矩形、圓形或線遮罩(請(qǐng)參考)
在這種情況下,我決定使用線遮罩,因?yàn)樗鼈兏`活地覆蓋不同方向的文本(矩形遮罩只適用于平行或垂直于x軸的單詞,圓形遮罩將覆蓋比較大的區(qū)域)。
為了應(yīng)用遮罩,我們需要提供線的起點(diǎn)和終點(diǎn)坐標(biāo)以及線的厚度:
起點(diǎn)將是框的左上角和左下角之間的中點(diǎn),終點(diǎn)將是右上角和右下角之間的中點(diǎn)。
對(duì)于厚度,我們將計(jì)算左上角和左下角之間的線長(zhǎ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é)起來(lái),創(chuàng)建一個(gè)函數(shù)來(lái)去除任何圖像中的文本。
我們只需要生成框列表,并迭代每個(gè)文本框。
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é)果(之前和之后):
另外兩個(gè)例子:
請(qǐng)注意,如果要保存圖像,需要將其轉(zhuǎn)換為RGB格式,否則顏色會(huì)反轉(zhuǎn)!
img_rgb = cv2.cvtColor(img, cv2.COLOR_BGR2RGB) cv2.imwrite(‘text_free_image.jpg',img_rgb)
如果你只對(duì)刪除某些單詞感興趣,則可以包括一個(gè)if條件,如下所示:
給出了一個(gè)要?jiǎng)h除的單詞列表
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)
當(dāng)然,這只是一個(gè)快速的例子,說(shuō)明了如何對(duì)特定的單詞列表進(jìn)行修復(fù)。
結(jié)尾
在這篇文章中,我們討論了如何實(shí)現(xiàn)一種算法來(lái)自動(dòng)刪除圖像中的文本,該算法使用一個(gè)預(yù)訓(xùn)練好的OCR模型(使用Keras)和一個(gè)使用cv2的修復(fù)算法。該算法似乎可以很好地從圖像中快速刪除文本,而無(wú)需為此特定任務(wù)訓(xùn)練模型。
當(dāng)文本框靠近其他對(duì)象時(shí),它通常表現(xiàn)不好,因?yàn)樗赡軙?huì)扭曲周?chē)h(huán)境。
以上就是Python使用Keras OCR實(shí)現(xiàn)從圖像中刪除文本的詳細(xì)內(nèi)容,更多關(guān)于Python圖像刪除文本的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Selenium關(guān)閉INFO:CONSOLE提示的解決
這篇文章主要介紹了Selenium關(guān)閉INFO:CONSOLE提示的解決,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-12-12簡(jiǎn)單的命令查看安裝的python版本號(hào)
在本篇內(nèi)容里小編給大家整理的是關(guān)于簡(jiǎn)單的命令查看安裝的python版本號(hào)的文章,需要的朋友們可以參考下。2020-08-08Python實(shí)現(xiàn)合并多張圖片成視頻的示例詳解
隨著短視頻的興起,越來(lái)越多的人開(kāi)始用各種形式進(jìn)行視頻制作,本篇博客從程序員的角度為大家解析一下如何通過(guò)?Python?合并多個(gè)圖片為一個(gè)視頻,需要的可以參考一下2023-02-02python通過(guò)wxPython打開(kāi)一個(gè)音頻文件并播放的方法
這篇文章主要介紹了python通過(guò)wxPython打開(kāi)一個(gè)音頻文件并播放的方法,實(shí)例分析了wxPython操作音頻文件的技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-03-03Matlab中關(guān)于argmax、argmin函數(shù)的使用解讀
這篇文章主要介紹了Matlab中關(guān)于argmax、argmin函數(shù)的使用解讀,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-12-12python GUI庫(kù)圖形界面開(kāi)發(fā)之PyQt5選項(xiàng)卡控件QTabWidget詳細(xì)使用方法與實(shí)例
這篇文章主要介紹了python GUI庫(kù)圖形界面開(kāi)發(fā)之PyQt5選項(xiàng)卡控件QTabWidget詳細(xì)使用方法與實(shí)例,需要的朋友可以參考下2020-03-03Python socket模塊實(shí)現(xiàn)的udp通信功能示例
這篇文章主要介紹了Python socket模塊實(shí)現(xiàn)的udp通信功能,結(jié)合具體實(shí)例形式分析了Python使用socket模塊實(shí)現(xiàn)UDP通信客戶端與服務(wù)器端相關(guān)實(shí)現(xiàn)技巧,需要的朋友可以參考下2019-04-04