Определить строку деления в тексте, используя openCV - PullRequest
0 голосов
/ 10 января 2019

Я хочу обнаружить линию разделения в отсканированном документе, и вместо использования cv2.Canny я использовал cv2.threshold, чтобы получить довольно чистое предварительно обработанное изображение. Однако мой параметр для cv2.HoughLines может быть неправильным, и я получил хаос в конечном выводе. И линии не представлены в качестве установленного цвета.

Мой код:

import cv2
import numpy as np
from matplotlib import pyplot as plt

## (1) read
img = cv2.imread("q11.png")
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
plt.figure(figsize=(17,17))
plt.imshow(gray,cmap='gray')

## (2) threshold
th, threshed = cv2.threshold(gray, 200, 20, cv2.THRESH_BINARY_INV|cv2.THRESH_OTSU)
plt.figure(figsize=(15,15))
plt.imshow(threshed,cmap='gray')

## (3) HoughLines
lines = cv2.HoughLines(threshed,rho=1,theta=np.pi/180,threshold = 800)
for i in range(len(lines)):
    for rho,theta in lines[i]:
        a = np.cos(theta)
        b = np.sin(theta)
        x0 = a*rho
        y0 = b*rho
        x1 = int(x0 + 1000*(-b))
        y1 = int(y0 + 1000*(a))
        x2 = int(x0 - 1000*(-b))
        y2 = int(y0 - 1000*(a))
    cv2.line(threshed,(x1,y1),(x2,y2),(0,0,255),2)

plt.figure(figsize=(10, 10))
plt.subplot(111),plt.imshow(threshed)
plt.title('hough'), plt.xticks([]), plt.yticks([])

Оригинальная картинка: enter image description here

и после cv2.threshold с cv2.THRESH_BINARY_INV|cv2.THRESH_OTSU я получил: enter image description here

Я хочу иметь: enter image description here

Что я на самом деле получил:

enter image description here

1 Ответ

0 голосов
/ 25 июля 2019

Вот простой подход

  • Преобразование изображения в оттенки серого и размытие по Гауссу
  • Пороговое изображение
  • Расширять для улучшения контура
  • Обнаружение линий

Порог

image

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

Линии не отображаются в качестве установленного цвета

Это потому, что вы пытались нарисовать линию на бинарном изображении (пороговое изображение). Поскольку он имеет только один канал, пиксели имеют только белый или черный цвет. Таким образом, он не будет отображать цвет. Вы должны нарисовать его на цветном изображении

image

import cv2
import numpy as np

image = cv2.imread('1.jpg')
gray = cv2.cvtColor(image,cv2.COLOR_BGR2GRAY)
blur = cv2.GaussianBlur(gray, (5,5), 0)

thresh = cv2.threshold(blur,190, 255,cv2.THRESH_BINARY_INV)[1]
kernel = cv2.getStructuringElement(cv2.MORPH_CROSS, (5,5))
dilate = cv2.dilate(thresh, kernel, iterations=1)

minLineLength = 10
maxLineGap = 200
lines = cv2.HoughLinesP(dilate,1,np.pi/180,100,minLineLength,maxLineGap)
for line in lines:
    for x1,y1,x2,y2 in line:
        cv2.line(image,(x1,y1),(x2,y2),(0,0,255),3)

cv2.imshow('image', image)
cv2.imshow('thresh', thresh)
cv2.waitKey()
...