Так как ваш вопрос не совсем понятен, если вы хотите извлечь отдельные символы или целые слова, вот подход, чтобы сделать оба.
Отдельные символы
Основная идея здесь
- Преобразование изображения в оттенки серого и размытие по Гауссу
- Выполнить обнаружение острых кромок
- Найти контуры
- Итерация по контурам и фильтрация по минимальной площади
- Получить ограничивающие рамки и извлечь ROI
Обнаружение Canny Edge с использованием cv2.Canny()
Теперь мы перебираем контуры, используя cv2.findContours()
, фильтруем, используя cv2.contourArea()
, затем рисуем ограничивающие рамки.
Вот результаты для некоторых других ваших входных изображений
import cv2
image = cv2.imread('1.png')
original = image.copy()
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
blur = cv2.GaussianBlur(gray, (3,3), 0)
canny = cv2.Canny(blur, 120, 255, 1)
cnts = cv2.findContours(canny, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
cnts = cnts[0] if len(cnts) == 2 else cnts[1]
min_area = 100
image_number = 0
for c in cnts:
area = cv2.contourArea(c)
if area > min_area:
x,y,w,h = cv2.boundingRect(c)
cv2.rectangle(image, (x, y), (x + w, y + h), (36,255,12), 2)
ROI = original[y:y+h, x:x+w]
cv2.imwrite("ROI_{}.png".format(image_number), ROI)
image_number += 1
cv2.imshow('blur', blur)
cv2.imshow('canny', canny)
cv2.imshow('image', image)
cv2.waitKey(0)
Всего слов
Теперь, если вы хотите извлечь целые слова, вам нужно немного изменить стратегию
- Преобразование изображения в оттенки серого и размытие по Гауссу
- Выполнить обнаружение острых кромок
- Расширьте, чтобы получить один контур
- Найти контуры
- Итерация по контурам и фильтрация с использованием минимальной площади
- Получить ограничивающие рамки и извлечь ROI
Распознавание краев Canny
Расширить, используя cv2.dilate()
для соединения контуров
Найти ограничивающие рамки и фильтр, используя область контура
Извлеченный ROI
Примечание. Если вы пытаетесь найти слова целиком, вам, возможно, придется изменить минимальное значение площади, поскольку оно зависит от анализируемого изображения.
import cv2
image = cv2.imread('1.png')
original = image.copy()
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
blur = cv2.GaussianBlur(gray, (3,3), 0)
canny = cv2.Canny(blur, 120, 255, 1)
kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (9,9))
dilate = cv2.dilate(canny, kernel, iterations=5)
cnts = cv2.findContours(dilate, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
cnts = cnts[0] if len(cnts) == 2 else cnts[1]
min_area = 5000
image_number = 0
for c in cnts:
area = cv2.contourArea(c)
if area > min_area:
x,y,w,h = cv2.boundingRect(c)
cv2.rectangle(image, (x, y), (x + w, y + h), (36,255,12), 2)
ROI = original[y:y+h, x:x+w]
cv2.imwrite("ROI_{}.png".format(image_number), ROI)
image_number += 1
cv2.imshow('blur', blur)
cv2.imshow('dilate', dilate)
cv2.imshow('canny', canny)
cv2.imshow('image', image)
cv2.waitKey(0)