Я хочу найти края на моем изображении, особенно вертикальные изменения интенсивности, которые переходят от светлого к темному. Это возможно? Я использую детекторы краев Canny/Sobel в OpenCV, но они улавливают края там, где увеличивается интенсивность, чего я не хочу.
Вычислить преимущество для уменьшения интенсивности только
Ответы (2)
Вы можете написать собственный фильтр и использовать cvFilter2D (2D свертка).
Чтобы привести очень простой пример, ядро свертки {1 0 -1;1 0 -1; 1 0 -1} — это фильтр 3x3, который может выделять уменьшение интенсивности слева направо. Вы можете порог результата, чтобы получить края.
Вам нужно будет выбрать правильный размер ядра, а также правильные значения, соответствующие вашим изображениям.
Вот хорошая ссылка, показывающая, как использовать cvFilter2d:
Как только вы поймете, что эти фильтры делают математически, становится совершенно ясно, что и что вам нужно изменить. И где в конвейере это должно быть. В своем ответе Тоторо уже указал, что вы можете передавать свои собственные фильтры для запуска.
Обнаружение края Собеля работает, сначала запуская два фильтра на изображении. Эти фильтры дают градиент изображения в направлениях X и Y. Края и градиенты связаны таким образом, что большая величина градиента означает, что в изображении много изменений, которые указывают на край!
Итак, следующий шаг (iirc) в алгоритме Собеля — найти величину градиентов. И, наконец, вы ограничиваете это, чтобы принимать только большие изменения в изображении в качестве краев. Наконец, вы выполняете некоторое утоньшение краев и пороговое значение гистерезиса вдоль направления края, но здесь это не очень важно.
Важный шаг, в котором вы хотите отличаться от алгоритма Собеля, заключается в том, что вы заботитесь об направлении изменений. Если вы вычисляете направление изменения по градиентам X и Y (используя синус и косинус), вы можете отфильтровать ребра, которые идут только в нужном вам направлении.
Если вас интересуют только вертикальные изменения, вы можете запустить ядро свертки, которое вычисляет градиент по горизонтали и принимает только положительные значения. Все положительные значения будут означать, что имело место вертикальное изменение от светлого к темному. Если вы хотите, вы можете выполнить следующие шаги обработки так же, как это сделал бы Собел.
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