Как удалить все строки в файле изображения .jpg? - PullRequest
4 голосов
/ 11 июля 2019

Мне нужно удалить строки на изображении, которое в конечном итоге является таблицей.Я нашел способ удалить горизонтальные и вертикальные линии:

convert 1.jpg -type Grayscale -negate -define morphology:compose=darken -morphology Thinning 'Rectangle:1x80+0+0<' -negate out.jpg

Следующее изображение:

enter image description here

Преобразован вследующий:

enter image description here

Как видно, диагональная линия все еще там.Я пытался повернуть изображение на 45 градусов, а затем попытался удалить его, но также не удалось.Как это можно сделать?Любые предложения приветствуются.Я выбрал imagemagick, но любые другие варианты приветствуются

Ответы [ 2 ]

5 голосов
/ 11 июля 2019

image

Вы можете попробовать использовать cv2.HoughLinesP() для определения диагональной линии, а затем использовать маску для заполнения контура

import cv2
import numpy as np

image = cv2.imread('1.jpg')
mask = np.zeros(image.shape, np.uint8)
gray = cv2.cvtColor(image,cv2.COLOR_BGR2GRAY)
canny = cv2.Canny(gray,100,200)
kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (5,5))
close = cv2.morphologyEx(canny, cv2.MORPH_CLOSE, kernel)
minLineLength = 10
maxLineGap = 350
lines = cv2.HoughLinesP(close,1,np.pi/180,100,minLineLength,maxLineGap)
for line in lines:
    for x1,y1,x2,y2 in line:
        cv2.line(mask,(x1,y1),(x2,y2),(255,255,255),3)

mask = cv2.cvtColor(mask,cv2.COLOR_BGR2GRAY)
cnts = cv2.findContours(mask, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
cnts = cnts[0] if len(cnts) == 2 else cnts[1]

for c in cnts:
    cv2.drawContours(image, [c], -1, (255,255,255), -1)

cv2.imshow('mask', mask)
cv2.imshow('image', image)
cv2.imwrite('image.png', image)
cv2.waitKey()
4 голосов
/ 11 июля 2019

Вот другой подход.Я использую Imagemagick, так как я не разбираюсь в OpenCV.По сути, я бинаризовал изображение.Затем выполните обработку подключенных компонентов, чтобы изолировать самую большую непрерывную черную область, которая будет черными линиями, которые вы хотите исключить.Тогда используйте это как маску, чтобы заполнить белым по линиям.Это синтаксис Unix с Imagemagick.

Обратите внимание, что некоторые текстовые символы будут потеряны, если они коснутся черных линий.

Ввод:

enter image description here

Получите идентификационный номер самой большой черной области:

id=`convert Arkey.jpg -threshold 50% -type bilevel \
-define connected-components:verbose=true \
-define connected-components:mean-color=true \
-connected-components 4 null: |\
grep "gray(0)" | head -n 1 | sed -n 's/^ *\(.*\):.*$/\1/p'`


Изолируйте черные линии и расширяйте их

convert Arkey.jpg -threshold 50% -type bilevel \
-define connected-components:mean-color=true \
-define connected-components:keep=$id \
-connected-components 4 \
-alpha extract \
-morphology dilate octagon:2 \
mask.png


enter image description here

Залейте белый цвет над линиями изображения, используя маску для контроля:

convert Arkey.jpg \( -clone 0 -fill white -colorize 100 \) mask.png -compose over -composite result.png


enter image description here

См. -Connected-components в https://imagemagick.org/script/connected-components.php для получения подробной информации о том, как это работает.

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