Python OpenCV: Hough Transform не обнаруживает явных линий - PullRequest
1 голос
/ 25 мая 2019

Проблема: Я хочу обнаружить строки в данном изображении, используя OpenCV в Python.Хотя существует множество очевидных вертикальных линий, ни нормальные HoughLines, ни вероятностные HoughLines не находят их.Поскольку я провел много времени, играя с параметрами, я думаю, что я делаю что-то фундаментальное неправильно здесь.Мне известно о том факте, что на краях, как правило, после нанесения кайны, обычно наносятся штрихи.Из-за максимального подавления canny's, canny здесь не дает хороших результатов.

Изображение, где обнаруживаются вертикальные линии Сбои:

enter image description here

Почему: Учитывая это (изображение счетчика воды):

enter image description here

Я хочу обнаружить прямоугольник вокругкаждая цифра.Чтобы обнаружить прямоугольники, я использовал фильтры sobel в направлении x и y и рассчитал величину и угол / фазу градиента.Предполагая, что на этом этапе изображение будет правильно повернуто, я извлекаю вертикальные и горизонтальные края, как показано на рисунке.Я надеялся использовать houghLines, чтобы найти ограничивающие рамки.Поиск горизонтальных линий работает отлично, как видно на графике отладки

, содержащем дальнейшее понимание проблемы, где я не работаю с вертикальными компонентами (второй ряд):

enter image description here

Обнаружение прямоугольников вокруг каждой цифры поможет мне

  1. найти интересующую область
  2. вырезать область внутри прямоугольника,другими словами цифра.У нескольких других подходов для непосредственного определения цифр с помощью контуров возникла проблема с внешними прямоугольниками, мешающими цифре.

Обновление: код для обнаружения вертикальных линий:

#img is initialized with the binarized, vertical component image, as shown above
minLength = 30
maxGap = 7
angle_res = np.pi / 180
rad_res = 2
threshold_val = 100

linesP = cv2.HoughLinesP(img, rad_res, angle_res, threshold_val, minLineLength=minLength, maxLineGap=maxGap)

cdst = cv2.cvtColor(img, cv2.COLOR_GRAY2BGR)
cdstP = np.copy(cdst)
if linesP is None:
    print("Error when finding lines (probabilistic hough transformation). No lines detected")
else:
    # Copy edges to the images that will display the results in BGR
    for i in range(0, len(linesP)):
        l = linesP[i][0]
        cv2.line(cdstP, (l[0], l[1]), (l[2], l[3]), (255,0,0), 3, cv2.LINE_AA)

plt.imshow(cdstP); plt.show()

1 Ответ

1 голос
/ 25 мая 2019

Сначала примените canny edge с правильными настройками порога.Затем примените вероятностное преобразование прямой линии.После применения грубого преобразования отфильтруйте линии с уклоном.Вы хотите отфильтровать поле, поэтому вам нужно отфильтровать горизонтальные и вертикальные линии.После фильтрации линий примените морфологическое расширение и эрозию к полученному изображению, чтобы получить аккуратную рамку вокруг каждой цифры.При применении грубого преобразования выберите параметры минимальная длина строки, максимальная длина строки и максимальный разрыв строки соответственно.Вы можете использовать функцию трекбара при выборе подходящих параметров.Пример кода приведен ниже для выбора порогового значения для кромки канни.

import cv2
import numpy as np

cv2.namedWindow('Result')
img = cv2.imread('qkEuE.png')

v1 = 0
v2 = 0

def doEdges():
    edges = cv2.Canny(img,v1,v2)
    edges = cv2.cvtColor(edges,cv2.COLOR_GRAY2BGR)
    res = np.concatenate((img,edges),axis = 0)
    cv2.imshow('Result',res)
def setVal1(val):
    global v1
    v1 = val
    doEdges()
def setVal2(val):
    global v2
    v2 = val
    doEdges()

cv2.createTrackbar('Val1','Result',0,500,setVal1)
cv2.createTrackbar('Val2','Result',0,500,setVal2)

cv2.imshow('Result',img)
cv2.waitKey(0)
cv2.destroyAllWindows

Надеюсь, это поможет вам.

...