OpenCV: как удалить текст с фона - PullRequest
2 голосов
/ 12 октября 2019

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

Мой подход заключается в использовании pytesseract для получения текстовых полей и после того, как я получаю блокиЯ использую cv2.inpaint, чтобы нарисовать его и удалить текст оттуда. Короче говоря:

d = pytesseract.image_to_data(img, output_type=Output.DICT) # Get text
n_boxes = len(d['level']) # get boxes
for i in range(n_boxes): #  Looping through boxes
    # Get coordinates
    (x, y, w, h) = (d['left'][i], d['top'][i], d['width'][i], d['height'][i])
    crop_img = img[y:y+h, x:x+w] # Crop image
    gray = cv2.cvtColor(crop_img, cv2.COLOR_BGR2GRAY)
    gray = inverte(gray) # Inverse it
    thresh = cv2.threshold(gray, 0, 255, cv2.THRESH_OTSU)[1]
    dst = cv2.inpaint(crop_img, thresh, 10, cv2.INPAINT_TELEA) # Then Inpaint
    img[y:y+h, x:x+w] = dst # Place back cropped image back to the source image

Теперь проблема в том, что я не могу удалить текст полностью Изображение: enter image description here

Теперь я не уверен, какой другой методЯ могу использовать для удаления текста с изображения, я новичок в этом, поэтому я сталкиваюсь с проблемой. Любая помощь очень ценится

Примечание: изображение выглядит растянутым, потому что я изменил его размер, чтобы показать его на экране размером

Исходное изображение:

enter image description here

1 Ответ

3 голосов
/ 12 октября 2019

Вот подход, использующий морфологические операции + контурная фильтрация

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

Я использовал инструменты разработчика Chrome, чтобы определить цвет фона изображения, который был (222,228,251). Если вы хотите динамически определить цвет фона, вы можете попробовать найти доминирующий цвет, используя k-means . Вот результат

enter image description here

import cv2

image = cv2.imread('1.jpg')
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
thresh = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY_INV + cv2.THRESH_OTSU)[1]

close_kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (15,3))
close = cv2.morphologyEx(thresh, cv2.MORPH_CLOSE, close_kernel, iterations=1)

dilate_kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (5,3))
dilate = cv2.dilate(close, dilate_kernel, iterations=1)

cnts = cv2.findContours(dilate, 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 > 800 and area < 15000:
        x,y,w,h = cv2.boundingRect(c)
        cv2.rectangle(image, (x, y), (x + w, y + h), (222,228,251), -1)

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