Вот два разных подхода:
1. Традиционная обработка изображений и контурная фильтрация
Основная идея состоит в том, чтобы извлечь ROI, а затем применить оптический анализ Тессеракта.
- Преобразование изображения в оттенки серого и размытие по Гауссу
- Адаптивный порог
- Поиск контуров
- Итерация по контурам и фильтрация с использованием аппроксимации контуров и области
- Извлечение ROI
Как только мы получимдвоичное изображение из адаптивного порога, мы находим контуры и фильтруем, используя приближение контура с cv2.arcLength()
и cv2.approxPolyDP()
. Если контур имеет четыре точки, мы предполагаем, что это либо прямоугольник, либо квадрат. Кроме того, мы применяем второй фильтр, используя контурную область, чтобы гарантировать, что мы изолируем правильный ROI. Вот извлеченный ROI
![enter image description here](https://i.stack.imgur.com/V048D.png)
import cv2
image = cv2.imread('1.png')
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
blur = cv2.GaussianBlur(gray, (3,3), 0)
thresh = cv2.adaptiveThreshold(blur,255,cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY_INV,9,3)
cnts = cv2.findContours(thresh, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
cnts = cnts[0] if len(cnts) == 2 else cnts[1]
ROI_number = 0
for c in cnts:
area = cv2.contourArea(c)
peri = cv2.arcLength(c, True)
approx = cv2.approxPolyDP(c, 0.05 * peri, True)
if len(approx) == 4 and area > 2200:
x,y,w,h = cv2.boundingRect(approx)
ROI = image[y:y+h, x:x+w]
cv2.imwrite('ROI_{}.png'.format(ROI_number), ROI)
ROI_number += 1
Теперь мы можем бросить это в Pytesseract. Примечание. Pytesseract требует, чтобы текст изображения был черным, а фон - белым, поэтому сначала нужно выполнить небольшую предварительную обработку. Вот предварительно обработанное изображение и результат Pytesseract
![enter image description here](https://i.stack.imgur.com/Fpel8.png)
Перезагрузка
import cv2
import pytesseract
pytesseract.pytesseract.tesseract_cmd = r"C:\Program Files\Tesseract-OCR\tesseract.exe"
image = cv2.imread('ROI.png',0)
thresh = cv2.threshold(image, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)[1]
result = 255 - thresh
data = pytesseract.image_to_string(result, lang='eng',config='--psm 10 ')
print(data)
cv2.imshow('thresh', thresh)
cv2.imshow('result', result)
cv2.waitKey()
Обычно вы такжеНужно использовать морфологические преобразования, чтобы сгладить изображение, но для этого случая достаточно текста достаточно
2. Определение порога цвета
Второй подход заключается в использовании порогового значения цвета с нижним и верхним порогами ВПГ для создания маски, в которой мы можем извлечь область интереса. Смотрите здесь для полного примера. После того, как ROI извлечен, мы выполняем те же шаги, чтобы предварительно обработать изображение, прежде чем выбросить его в Pytesseract