OpenCV находит все значимые ребра вдоль линии - PullRequest
0 голосов
/ 22 марта 2012

У меня есть изображение, которое я использовал для анализа в LabView с помощью метода Rake.По сути, этот метод находит все значимые ребра вдоль параллельных линий на изображении.http://zone.ni.com/reference/en-XX/help/370281P-01/imaqvision/imaq_rake_3/ (как видно на последнем изображении внизу ссылки).Прелесть этой функции в том, что она даст вам все ребра, которые превышают определенную силу ребра, и каждый край будет генерировать только одну точку ребра (толщина линии ребра составляет 1 пиксель)

Я хочуиспользовать OpenCV, чтобы сделать что-то подобное.Для этого я мог бы представить себе - деконструкцию оператора Canny с помощью фильтра по моему выбору, - пороговое значение hysterisis для краевых значений с двумя порогами - с последующим подавлением немаксимальных значений - считывание пикселей вдоль этой линии и маркировку всех пикселей большего размера.чем мой порог

проблема в том, что canny идет как связка, и я не могу найти функцию подавления не максимума сама по себе.Кто-нибудь знает способ сделать что-то похожее на операцию, которую я описал?

Спасибо

1 Ответ

0 голосов
/ 22 апреля 2012

Не уверен, что я полностью понимаю этот вопрос, но по поводу разделенной части не-максимального подавления:

Один простой способ для двумерного не-максимального подавления - это: расширить изображение.Расширение в OpenCV устанавливает значение каждого пикселя в max () локальной окрестности.Повторите несколько раз или используйте большее ядро, чтобы получить желаемый радиус.

Затем сравните расширенное изображение с оригиналом и установите все пиксели с разными значениями на ноль.

Остальные пиксели являются локальными максимумами.

 # some code I once used in OpenCV/Python
 # given an image, sets all pixels to zero, unless they are local maxima
 def supressNonMaxima(img):
     localMax = cvCreateImage (cvGetSize(img), IPL_DEPTH_16U, 1)
     cvDilate(img, localMax, null, 3)  # max() with radius of 3

     mask = cvCreateImage( cvGetSize(img), 8, 1)
     cvCmp(img, localMax, mask, CV_CMP_LT)

     cvSet(img,0,mask)
...