ste*_*dv 2 python ocr image image-processing python-tesseract
通过tesseract-OCR,我试图从以下带有红色背景的图像中提取文本。
我在提取框 B 和 D 中的文本时遇到问题,因为有垂直线。我怎样才能像这样清理背景:
输入:
输出:
这里有两种使用 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()
Run Code Online (Sandbox Code Playgroud)
方法#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()
Run Code Online (Sandbox Code Playgroud)