Эквивалентный код OpenCV для команды Image Magick - PullRequest
0 голосов
/ 31 октября 2019

Я пытаюсь предварительно обработать мои изображения, чтобы удалить из них горизонтальные и вертикальные линии (требуется для некоторых OCR). Я получил код Image Magick, чтобы сделать то же самое, что работает довольно хорошо. Ниже приведен фрагмент кода:

magick convert ( img_name.jpg )    
( -clone 0 -morphology close rectangle:1x50 -negate +write tmp1.png )    
( -clone 0 -morphology close rectangle:50x1 -negate +write tmp2.png )    
( -clone 1 -clone 2 -evaluate-sequence add +write tmp3.png )
-delete 1,2     
-compose plus -composite    
result.jpg

Это было получено по приведенной ниже ссылке (полная оценка им):

Удалите все горизонтальные и вертикальные линии из изображения

Дело в том, что, несмотря на то, что Image Magick работает хорошо, на изображениях с высоким разрешением уходит очень много времени (это то, что я в основном имею). Поэтому я пытаюсь преобразовать приведенный выше фрагмент в код Open CV Python. Я уже написал частичный код для шагов 1 и 2.

Шаг 1 и 2:

img = cv2.imread('img_name.jpg', cv2.IMREAD_COLOR)
kernel_vertical = cv2.getStructuringElement(cv2.MORPH_RECT, (1,50))
kernel_horizontal = cv2.getStructuringElement(cv2.MORPH_RECT, (50,1))

temp_1 = cv2.morphologyEx(img, cv2.MORPH_CLOSE, kernel_vertical)
#cv2.imwrite('temp_1.png',temp_1)

temp_2 = cv2.morphologyEx(img, cv2.MORPH_CLOSE, kernel_horizontal)
#cv2.imwrite('temp_2.png',temp_2)

Однако я не могу выполнить Шаг 3 и 4, потому что я не уверен, что именно Оператор оценки-последовательности Оператор делает. Я искал это онлайн, но не понял достаточно хорошо. Если кто-нибудь сможет помочь мне перевести остальные шаги, я буду очень признателен.

1 Ответ

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

Вот эквивалентные команды в Python / OpenCV.

Ввод:

enter image description here

import cv2
import numpy as np

img = cv2.imread('document.png')

# do morphology to locate vertical lines and invert
kernel_vertical = cv2.getStructuringElement(cv2.MORPH_RECT, (1,50))
temp1 = cv2.morphologyEx(img, cv2.MORPH_CLOSE, kernel_vertical)
temp1 = (255-temp1)

# do morphology to locate horizontal lines and invert
kernel_horizontal = cv2.getStructuringElement(cv2.MORPH_RECT, (50,1))
temp2 = cv2.morphologyEx(img, cv2.MORPH_CLOSE, kernel_horizontal)
temp2 = (255-temp2)

# add the two temp images together
temp = cv2.add(temp1, temp2)

# add temp to img to create result
result = cv2.add(temp, img)

# write result to disk
cv2.imwrite("document_lines_removed.png", result)

# display it
cv2.imshow("temp1", temp1)
cv2.imshow("temp2", temp2)
cv2.imshow("temp", temp)
cv2.imshow("result", result)
cv2.waitKey(0)


enter image description here

...