Как фильтровать строки без фильтра Собела в OpenCV - PullRequest
1 голос
/ 22 сентября 2011

Я пытаюсь обнаружить линии только с помощью линейных фильтров.Моей первой попыткой было вращение ядра, подобного этому, но оно не сработало:

kernel = zeros((13,13))
kernel60 = zeros((13,13))

kernel[4] = [0,0,0,0,-1,-1,-1,-1,-1,0,0,0,0]
#kernel[5] = [0,0,0,0,0]
kernel[6] = [0,0,0,0,2,2,2,2,2,0,0,0,0]
#kernel[7] = [0,0,0,0,0]
kernel[8] = [0,0,0,0,-1,-1,-1,-1,-1,0,0,0,0]

rotate60 = zeros((2,3))
GetRotationMatrix2D((6,6),60,1, rotate60)
WarpAffine(kernel,kernel60,rotate60,CV_WARP_FILL_OUTLIERS, ScalarAll(0))

После этого я подготовил ядро, представляющее собой линейную комбинацию из двух ядер Собеля (управляемые фильтры).Это работает, но я бы предпочел не-sobel ядро, похожее на первую попытку.Любая альтернатива ядрам sobel?

Комбинация ядра Собеля:

kernel_x[0] = [-1,0,+1]
kernel_x[1] = [-1,0,+1]
kernel_x[2] = [-1,0,+1]

kernel_y[0] = [-1,-1,-1]
kernel_y[1] = [0,0,0]
kernel_y[2] = [+1,+1,+1]

normal_theta = radians(-30)
kernel = multiply(cos(theta),kernel_x) + multiply(sin(theta),kernel_y)

Затем фильтрация:

Filter2D(src,dst,kernel)

Я использую Python и numpy на компьютере с Windows.

1 Ответ

0 голосов
/ 28 декабря 2011

Вы можете использовать алгоритм Канни для обнаружения краев (который в любом случае использует Собел) и преобразование Хафа для обнаружения линий.Выполнение размытия перед Canny может помочь устранить выбросы.Это классический подход.Вы можете использовать OpenCV, который реализует обе части.

См. Следующее:

http://en.wikipedia.org/wiki/Hough_transform

http://en.wikipedia.org/wiki/Canny_edge_detector

Вот документация для реализации OpenCV: http://opencv.willowgarage.com/documentation/cpp/imgproc_feature_detection.html

см. функции cvHoughLines * есть пример кода

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