Как удалить текст с наброска изображения

#python #python-3.x #opencv

Вопрос:

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

Я использую этот код:

 import cv2
import pytesseract

pytesseract.pytesseract.tesseract_cmd = r"C:Program FilesTesseract-OCRtesseract.exe"

# Load image, grayscale, blur, Otsu's threshold
image = cv2.imread('1.png')
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
blur = cv2.GaussianBlur(gray, (3,3), 0)
thresh = cv2.threshold(blur, 0, 255, cv2.THRESH_BINARY_INV   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 > 500:
        cv2.drawContours(thresh, [c], -1, 0, -1)

# Invert image and OCR
invert = 255 - thresh
Output= thresh - invert 
cv2.imshow('thresh', thresh)
cv2.imshow('invert', invert)
cv2.imshow('output', output)
cv2.waitKey()
 

Код не работает для этих изображений.

Комментарии:

1. Все ли ваши изображения с тонкими линиями на рисунках и жирными подписями, как в приведенном выше примере?

2. Рисунок также может быть выделен жирным шрифтом, но подпись выделена жирным шрифтом. Я пытаюсь просто удалить текст. Спасибо

Ответ №1:

cv2 Предварительная обработка здесь не требуется, tesseract может найти текст самостоятельно. Смотрите пример ниже, прокомментированный в строке:

 results = pytesseract.image_to_data('1.png', config='--psm 11', output_type='dict')

for i in range(len(results["text"])):
    # extract the bounding box coordinates of the text region from
    # the current result
    x = results["left"][i]
    y = results["top"][i]
    w = results["width"][i]
    h = results["height"][i]
    # Extract the confidence of the text
    conf = int(results["conf"][i])
    
    if conf > 60: # adjust to your liking
        # Cover the text with a white rectangle
        cv2.rectangle(image, (x, y), (x   w, y   h), (255, 255, 255), -1)
 

Обнаруженный текст слева, очищенное изображение справа:

Результаты

Ответ №2:

Другой вариант, без использования Tesseract . Просто используйте area контуры, чтобы отфильтровать более мелкие, покрыв их прямоугольниками, заполненными белым:

 # Imports
import cv2
import numpy as np

# Read image
imagePath = "C://opencvImages//"
inputImage = cv2.imread(imagePath "0enxN.png")

# Convert BGR to grayscale:
binaryImage = cv2.cvtColor(inputImage, cv2.COLOR_BGR2GRAY)
# Invert image:
binaryImage = 255 - binaryImage

# Find the external contours on the binary image:
contours, hierarchy = cv2.findContours(binaryImage, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
# Invert image:
binaryImage = 255 - binaryImage

# Look for the bounding boxes:
for _, c in enumerate(contours):

    # Get the contour's bounding rectangle:
    boundRect = cv2.boundingRect(c)

    # Get the dimensions of the bounding rect:
    rectX = boundRect[0]
    rectY = boundRect[1]
    rectWidth = boundRect[2]
    rectHeight = boundRect[3]

    # Get Bounding Rectangle Area:
    rectArea = rectWidth * rectHeight
    # Set minimum area threshold:
    minArea = 1000

    # Check for minimum area:
    if rectArea < minArea:
        # Draw white rectangle to cover small contour:
        cv2.rectangle(binaryImage, (rectX, rectY), (rectX   rectWidth, rectY   rectHeight),
                      (255, 255, 255), -1)
        cv2.imshow("Binary Mask", binaryImage)
        cv2.waitKey(0)
 

Это приводит к:

введите описание изображения здесь