Как я могу удалить все на изображении, кроме текста в Python? - PullRequest
3 голосов
/ 25 сентября 2019

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

def erode(img):
        kernel = np.ones((3,3), np.uint8)
        eroded = cv2.erode(img, kernel, iterations=1)
        gray = cv2.cvtColor(eroded,cv2.COLOR_BGR2GRAY)
        edges = cv2.Canny(gray,50,150,apertureSize = 3)
        minLineLength = 10
        maxLineGap = 1
        lines = cv2.HoughLinesP(edges,1,np.pi/180,120,minLineLength,maxLineGap)
        for line in lines:
            for x1,y1,x2,y2 in line:
                cv2.line(eroded,(x1,y1),(x2,y2),(255,255,255),7)

Я пытался использовать функцию OpenCV houghLinesP и рисовал линию над ними, но этоне удаляет все строки и все еще оставляет некоторые точки повсюду, как это: img with dots

, что я хочу, чтобы дать что-то вроде этого в качестве ввода: with lines

и получить что-то вроде этого в качестве вывода: without lines

причина, по которой мне нужно удалить все строки, но не изменить текст, потому чтоМне нужно сохранить координаты текста.

1 Ответ

3 голосов
/ 25 сентября 2019

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

enter image description here

import cv2
import numpy as np

image = cv2.imread('3.png')
mask = np.ones(image.shape, dtype=np.uint8) * 255
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=3)

cnts = cv2.findContours(dilate, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
cnts = cnts[0] if len(cnts) == 2 else cnts[1]
for c in cnts:
    area = cv2.contourArea(c)
    if area < 5000:
        x,y,w,h = cv2.boundingRect(c)
        mask[y:y+h, x:x+w] = image[y:y+h, x:x+w]

cv2.imshow('thresh', thresh)
cv2.imshow('dilate', dilate)
cv2.imshow('mask', mask)
cv2.waitKey()
...