使用opencv进行阈值处理后的文本模糊

Text blur after thresholding using opencv

我正在使用 tesseract OCR 进行一些转换以从图像中捕获文本,但是,在这样做时,我的文本在应用一些阈值效果后变得模糊,所以我在这里需要一些帮助,一点帮助。

这是我的代码:

import cv2
import pytesseract as pyt
import numpy as np

pyt.pytesseract.tesseract_cmd = r"C:\Program Files\Tesseract-OCR\tesseract.exe"

image = cv2.imread('vacunacion.jpg')
gris = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
thresh = cv2.threshold(gris, 90, 255, cv2.THRESH_BINARY_INV)[1]
imagen_detalle = pyt.image_to_string(thresh, lang='eng',config='--psm 6')
print(imagen_detalle)
cv2.imshow('thresh', thresh)
cv2.imwrite('thresh.jpg', thresh)
cv2.waitKey()

我的输出:

2
> PLAN NACIONAL DE VACUNACION
CONTRA COVID-19 Hooia>—
| DOSIS APLICADAS: 191.480
CORTE 4:00 P.M. MARZO - 03 - 2021
SE AMDRES ay
“a 7 women {A GUNIRA (1345)
twas jf Ae d &
paunaanma Goer anda 760 — 2) ©? maaan
CARTABENA (3.457) BOLI (2500) — OESAN 018)
SURES) a ‘3 NORTE DE SANTANDER (25131
CORDOBA (2968) wo 6 SAATANDER (5.936)
ANTIONUIA (24.8563 TS - BOVAGA (5883),
CUNDALAMARCA (12.0251 TY ‘ ARAUCA C8)
SALDAS (23151 EN, f PS yionann 2
RAMLDA C320 wey Pee casa 1227
oan oe ts
Touma 5.080) BK eae 8 WETA (2444)
ALLE DEL cqUGA (20,160) ~=% se GUAINLA 592)
“m8 Se aN +S UAE (3023
‘ante ca o eco yqurtsig2an
puna 2635) ae SO BARUETAISES!
a
rum fe ‘AMAZDAAS (10548)
Oa
Fuente: Ministerio de Salud y Protecciin Saciat - Datos procesados 03 de marzo - 2021

这是最终图像

应用剂量的数量在图像中没有很好地欣赏,因为太模糊了,这里可以应用任何技术吗?

这是原图。

Tesseract 可以使用文本周围的渐变作为其检测的一部分,因此我建议您尽可能避免使用阈值,因为它会从图片。

相反,我建议在灰度化后反转图像,然后如有必要,您可以降低亮度以使灰色文本更黑一点,并增加对比度使灰色背景更深一点白色的。如果您确实需要调整亮度 and/or 对比度,我建议您使用 cv2.convertScaleAbs 来高效地进行调整并避免整数溢出问题。

  • 应用一些阈值效果后我的文字变得模糊

您应用了简单阈值处理,但没有达到预期的结果。缺少的两个部分是:

另一种阈值处理方法是采用 binary mask and applying some morphological-transformation。然后您需要显示每个检测到的文本区域,将图像居中并应用 OCR。使用这种方法,您可以可视化并查看问题出在哪里。

  • 1.二进制掩码

    • 正如我们所见,世界和背景图像已从图像中移除。

  • 2。膨胀

    • 我们应用了扩张和 bitwise_and 来更准确地检测文本。

    1. 检测文本区域
    • Tesseract 可能会多次找到同一区域。这个想法是找出文本的哪一部分被误解了。以下是一些示例:
Region Result
~ PLAN NACIONAL DE VACUNACION
CONTRA COVID-19 Fam>—
DOSIS APLICADAS: 191.480
CORTE 4:00 P.M. MARZO - 03 - 2021
YPROVIENGIA —» SANTA MARTA (9501 © — LA GUARA 11345)
BARRANGRILLA CS 997) ATLANTICD3 754) —- ° * —-— MAGDKLENACIS87)
GARTAGENA [3.457 }BOLIVAR (2.500) —, . CESAR (3.016)

我发现上面的结果(其中一些显示)使用英语。当前的语言对我来说很陌生。因此,您需要为 language

配置 tesseract

代码:


# Load the library
import cv2
import numpy as np
import pytesseract

# Load the image
img = cv2.imread("u1niV.jpg")

# Convert to HSV color-space
hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)

# Get binary mask
msk = cv2.inRange(hsv, np.array([0, 0, 181]), np.array([160, 255, 255]))

# Extract features
krn = cv2.getStructuringElement(cv2.MORPH_RECT, (5 ,3))
dlt = cv2.dilate(msk, krn, iterations=5)
res = 255 - cv2.bitwise_and(dlt, msk)

# OCR detection
d = pytesseract.image_to_data(res, output_type=pytesseract.Output.DICT)

# Get ROI part from the detection
n_boxes = len(d['level'])

# For each detected part
for i in range(n_boxes):

    # Get the localized region
    (x, y, w, h) = (d['left'][i], d['top'][i], d['width'][i], d['height'][i])

    # Draw rectangle to the detected region
    cv2.rectangle(img, (x, y), (x+w, y+h), (0, 255, 0), 5)

    # Crop the region
    cropped = res[y:y+h, x:x+w]

    # Center the region
    cropped = cv2.copyMakeBorder(cropped, 50, 50, 50, 50, cv2.BORDER_CONSTANT, value=255)

    # OCR the region
    txt = pytesseract.image_to_string(cropped)
    print(txt)

    # Display
    cv2.imshow("cropped", cropped)
    cv2.waitKey(0)

# Display
cv2.imshow("res", res)
cv2.waitKey(0)