Вычислить преимущество для уменьшения интенсивности только

Я хочу найти края на моем изображении, особенно вертикальные изменения интенсивности, которые переходят от светлого к темному. Это возможно? Я использую детекторы краев Canny/Sobel в OpenCV, но они улавливают края там, где увеличивается интенсивность, чего я не хочу.


person eagle34    schedule 27.08.2014    source источник
comment
вы можете попробовать фильтр sobel в направлении x: Sobel( src_gray, grad_x, ddepth, 1, 0, 3, scale, delta, BORDER_DEFAULT ); из docs. opencv.org/doc/tutorials/imgproc/imgtrans/   -  person Micka    schedule 28.08.2014
comment
Если бы вы могли включить минимальный рабочий пример, это было бы здорово. И, возможно, вы могли бы включить один пример изображения, которое показывает, что происходит.   -  person Unapiedra    schedule 28.08.2014


Ответы (2)


Вы можете написать собственный фильтр и использовать cvFilter2D (2D свертка).

Чтобы привести очень простой пример, ядро ​​свертки {1 0 -1;1 0 -1; 1 0 -1} — это фильтр 3x3, который может выделять уменьшение интенсивности слева направо. Вы можете порог результата, чтобы получить края.

Вам нужно будет выбрать правильный размер ядра, а также правильные значения, соответствующие вашим изображениям.

Вот хорошая ссылка, показывающая, как использовать cvFilter2d:

person Totoro    schedule 28.08.2014

Как только вы поймете, что эти фильтры делают математически, становится совершенно ясно, что и что вам нужно изменить. И где в конвейере это должно быть. В своем ответе Тоторо уже указал, что вы можете передавать свои собственные фильтры для запуска.

Обнаружение края Собеля работает, сначала запуская два фильтра на изображении. Эти фильтры дают градиент изображения в направлениях X и Y. Края и градиенты связаны таким образом, что большая величина градиента означает, что в изображении много изменений, которые указывают на край!

Итак, следующий шаг (iirc) в алгоритме Собеля — найти величину градиентов. И, наконец, вы ограничиваете это, чтобы принимать только большие изменения в изображении в качестве краев. Наконец, вы выполняете некоторое утоньшение краев и пороговое значение гистерезиса вдоль направления края, но здесь это не очень важно.

Важный шаг, в котором вы хотите отличаться от алгоритма Собеля, заключается в том, что вы заботитесь об направлении изменений. Если вы вычисляете направление изменения по градиентам X и Y (используя синус и косинус), вы можете отфильтровать ребра, которые идут только в нужном вам направлении.

Если вас интересуют только вертикальные изменения, вы можете запустить ядро ​​свертки, которое вычисляет градиент по горизонтали и принимает только положительные значения. Все положительные значения будут означать, что имело место вертикальное изменение от светлого к темному. Если вы хотите, вы можете выполнить следующие шаги обработки так же, как это сделал бы Собел.

person Unapiedra    schedule 28.08.2014