簡體   English   中英

OCR 的背景圖像清理

[英]Background image cleaning for OCR

通過 tesseract-OCR 我試圖從以下紅色背景的圖像中提取文本。

在此處輸入圖像描述

由於存在垂直線,我在提取框 B 和 D 中的文本時遇到問題。 我怎樣才能像這樣清理背景:

輸入:

在此處輸入圖像描述

output:

在此處輸入圖像描述

一些想法? 沒有框的圖像: 在此處輸入圖像描述

以下是使用 Python OpenCV 清理圖像的兩種方法

方法 #1:Numpy 閾值

由於垂直線、水平線和背景都是紅色的,我們可以利用這一點並使用 Numpy 閾值將高於閾值的所有紅色像素更改為白色。

在此處輸入圖像描述

import cv2
import numpy as np

image = cv2.imread('1.jpg')

image[np.where((image > [0,0,105]).all(axis=2))] = [255,255,255]

cv2.imshow('image', image)
cv2.waitKey()

方法#2:傳統圖像處理

對於更通用的方法,如果線條不是紅色的,我們可以使用簡單的圖像處理技術來清理圖像。 為了去除垂直和水平線,我們可以構造特殊的內核來隔離這些線,並使用掩碼和按位操作來去除它們。 一旦線條被移除,我們可以使用閾值、形態學操作和輪廓過濾來移除紅色背景。 這是該過程的可視化


首先我們構造垂直和水平內核然后cv2.morphologyEx()來檢測線條。 從這里開始,我們有水平和垂直線的單獨掩碼,然后按位 - 或兩個掩碼以獲得所有要刪除的行的掩碼。 接下來我們用原始圖像按位或刪除所有行

在此處輸入圖像描述 在此處輸入圖像描述 在此處輸入圖像描述 在此處輸入圖像描述

現在線條已被移除,我們可以着手移除紅色背景。 我們閾值以獲得二值圖像並執行形態學操作以平滑文本

在此處輸入圖像描述

仍然有小點所以要去除它們,我們找到輪廓並使用最小閾值區域進行過濾以去除小噪聲

在此處輸入圖像描述

最后我們反轉圖像得到我們的結果

在此處輸入圖像描述

import cv2

image = cv2.imread('1.jpg')

# Remove vertical and horizontal lines
kernel_vertical = cv2.getStructuringElement(cv2.MORPH_RECT, (1,50))
temp1 = 255 - cv2.morphologyEx(image, cv2.MORPH_CLOSE, kernel_vertical)
horizontal_kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (50,1))
temp2 = 255 - cv2.morphologyEx(image, cv2.MORPH_CLOSE, horizontal_kernel)
temp3 = cv2.add(temp1, temp2)
removed = cv2.add(temp3, image)

# Threshold and perform morphological operations
gray = cv2.cvtColor(removed, cv2.COLOR_BGR2GRAY)
thresh = cv2.threshold(gray, 180, 255, cv2.THRESH_BINARY_INV)[1]
kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (2,2))
close = cv2.morphologyEx(thresh, cv2.MORPH_CLOSE, kernel, iterations=1)

# Filter using contour area and remove small noise
cnts = cv2.findContours(close, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
cnts = cnts[0] if len(cnts) == 2 else cnts[1]
for c in cnts:
    area = cv2.contourArea(c)
    if area < 10:
        cv2.drawContours(close, [c], -1, (0,0,0), -1)

final = 255 - close 
cv2.imshow('removed', removed)
cv2.imshow('thresh', thresh)
cv2.imshow('close', close)
cv2.imshow('final', final)
cv2.waitKey()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM