使用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 来高效地进行调整并避免整数溢出问题。
- 应用一些阈值效果后我的文字变得模糊
您应用了简单阈值处理,但没有达到预期的结果。缺少的两个部分是:
-
- 你应该试试其他的 pre-processing methods.
-
- 你应该试试其他的 page-segmentation-modes
另一种阈值处理方法是采用 binary mask and applying some morphological-transformation。然后您需要显示每个检测到的文本区域,将图像居中并应用 OCR。使用这种方法,您可以可视化并查看问题出在哪里。
1.二进制掩码
正如我们所见,世界和背景图像已从图像中移除。
2。膨胀
我们应用了扩张和 bitwise_and 来更准确地检测文本。
-
- 检测文本区域
- 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)
我正在使用 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 来高效地进行调整并避免整数溢出问题。
- 应用一些阈值效果后我的文字变得模糊
您应用了简单阈值处理,但没有达到预期的结果。缺少的两个部分是:
-
- 你应该试试其他的 pre-processing methods.
-
- 你应该试试其他的 page-segmentation-modes
另一种阈值处理方法是采用 binary mask and applying some morphological-transformation。然后您需要显示每个检测到的文本区域,将图像居中并应用 OCR。使用这种方法,您可以可视化并查看问题出在哪里。
1.二进制掩码
正如我们所见,世界和背景图像已从图像中移除。
2。膨胀
我们应用了扩张和 bitwise_and 来更准确地检测文本。
-
- 检测文本区域
- 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)