Удалить ложные текстовые области из изображения - PullRequest
3 голосов
/ 14 января 2020

Я работаю над проектом по обнаружению текста в изображениях. До сих пор я был в состоянии выделить текстовые области кандидатов. Я использовал некоторые пороговые значения для соотношения сторон, площади контура и количества белых пикселей внутри ограничительной рамки счетчика, чтобы удалить нетекстовые области. Но я не могу дать слишком маленькие пороги для этих параметров, так как есть изображения с маленьким размером шрифта. Тем не менее, есть некоторые нетекстовые регионы. Я читал, что Stroke Width Transform является решением этой проблемы, но это сложно. Есть ли другой способ удалить эти нетекстовые области? Я думал об использовании кривой формы текста для различения guish областей, но не мог придумать, как это реализовать.

Это пример изображения

enter image description here

Идентифицированные регионы

enter image description here

1 Ответ

2 голосов
/ 15 января 2020

Вы можете использовать простую фильтрацию области контура для удаления шума. Идея состоит в том, чтобы найти контуры, отфильтровать с помощью cv2.contourArea() и нарисовать действительные контуры на пустой маске. Чтобы восстановить изображение без шума, мы побитово - и входное изображение с маской, чтобы получить наш результат.

Шум для удаления выделен зеленым цветом

enter image description here

Результат

enter image description here

Код

import cv2
import numpy as np 

# Load image, create blank mask, grayscale, Otsu's threshold
image = cv2.imread('1.png')
mask = np.zeros(image.shape, dtype=np.uint8)
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
thresh = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)[1]

# Find contours and filter using contour area
cnts = cv2.findContours(thresh, 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 > 250:
        cv2.drawContours(mask, [c], -1, (255,255,255), -1)

# Bitwise and to reconstruct image
result = cv2.bitwise_and(image, mask)

cv2.imshow('mask', mask)
cv2.imshow('result', result)
cv2.waitKey()

Примечание: Если вы знаете, что текст будет желтым, другой подход будет заключаться в использовании цветного порога для выделения текста. Вы можете использовать этот скрипт HSV для определения нижних / верхних границ

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...