Как сделать маски, чтобы установить для всего фона изображения, кроме текста, белый цвет? - PullRequest
1 голос
/ 05 июня 2019

Я пытаюсь извлечь текст в этой области, чтобы запустить OCR, но блуждающие черные края мешают некоторым результатам. Есть ли способ выделить этот текст?

enter image description here

После нахождения этого контура я обрезал его из исходного изображения с помощью черной маски фона. Я не слишком уверен, как изменить фон на белый, и при этом я не могу найти способ избавиться от черных краев вокруг контура. Установка порога изображения, кажется, избавляет от некоторых черных пикселей в тексте, которые я не хочу.

В идеале выводом должен быть просто черный текст и белый фон.

Это раздел в коде исходной маскировки, которую я пытался-

mask = np.ones(orig_img.shape).astype(orig_img.dtype)
cv2.fillPoly(mask, [cnt], (255,255,255))
cropped_contour = cv2.bitwise_and(orig_img, mask)

1 Ответ

0 голосов
/ 05 июня 2019

Чтобы изолировать текст, один из подходов состоит в том, чтобы получить координаты ограничивающего прямоугольника желаемой области интереса, а затем замаскировать эту область интереса на чистом белом изображении.Основная идея:

  • Преобразование изображения в оттенки серого
  • Пороговое изображение
  • Расширение изображения для соединения текста в виде единой ограничительной рамки
  • Поиск контурови отфильтруйте использованную область контура, чтобы найти область интереса
  • Поместите область интереса на маску

Пороговое изображение (слева), а затем расширите, чтобы соединить текст (справа)

image image

Вы можете найти контуры с помощью cv2.boundingRect(), затем, получив ROI, вы можете поместить эту ROI на маску с помощью

mask = np.zeros(image.shape, dtype='uint8')
mask.fill(255)
mask[y:y+h, x:x+w] = original_image[y:y+h, x:x+w]

Найти контуры и отфильтровать по ROI (слева), окончательный результат (справа)

image image

В зависимости от размера изображения вам может потребоваться настроить фильтр для области контура.

import cv2
import numpy as np

original_image = cv2.imread('1.png')
image = original_image.copy()
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
thresh = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY_INV | cv2.THRESH_OTSU)[1]
kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (5,5))
dilate = cv2.dilate(thresh, kernel, iterations=5)

# Find contours
cnts = cv2.findContours(dilate, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
cnts = cnts[0] if len(cnts) == 2 else cnts[1]

# Create a blank white mask
mask = np.zeros(image.shape, dtype='uint8')
mask.fill(255)

# Iterate thorugh contours and filter for ROI
for c in cnts:
    area = cv2.contourArea(c)
    if area < 15000:
        x,y,w,h = cv2.boundingRect(c)
        cv2.rectangle(image, (x, y), (x + w, y + h), (36,255,12), 2)
        mask[y:y+h, x:x+w] = original_image[y:y+h, x:x+w]

cv2.imshow("mask", mask)
cv2.imshow("image", image)
cv2.imshow("dilate", dilate)
cv2.imshow("thresh", thresh)
cv2.imshow("result", image)
cv2.waitKey(0)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...