2013-02-17 2 views
0

Я использую GPUImage из репозитория Git, чтобы применить некоторые фильтры к изображениям. Я заметил, что фильтры обнаружения края (я использую специально CannyEdgeDetectionFilter) красят белые края на черном фоне. Любой знает, как сделать черные полосы на белом фоне - или другой фильтр, который будет делать это (и не быть тяжеловесным, поскольку это единственный фильтр, который мне понадобится из этой библиотеки).GPUImage CannyEdgeDetectionFilter с белыми краями?

Thanks Tony.

ответ

0

GPUImageColorInvertFilter доступен с GPUImage и должен делать то, что вам нужно.

0

Как предлагает Гарретт, вы можете просто инвертировать цвета этого фильтра, чтобы получить желаемый результат. Тем не менее, это добавит еще один фильтр в цепочку и может замедлить работу.

Вы можете получить обратный фильтр обнаружения края Sobel с помощью GPUImageSketchFilter. Единственное различие между двумя фильтрами - это вторая строка последнего фрагмента шейдера фрагмента, где возвращаемый цвет равен 1,0 минус интенсивность края, а не только интенсивность края.

То же самое можно сделать здесь Канни обнаружения края, только вам нужно заменить GPUImageWeakPixelInclusionFilter с той, которая имеет следующий за последней строкой в ​​его шейдера:

gl_FragColor = vec4(vec3(1.0 - sumTest * pixelTest), 1.0); 

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

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

+0

Спасибо @Brad. Я не слишком озабочен скоростью, хотя, очевидно, быстрее. Моя цель состоит в том, чтобы сделать фотографию в виде линейного рисунка - как предшественника для физического рисования изображения на холсте. Я попробовал один из фильтров обнаружения пороговых границ, но, похоже, было много лишнего шума, но я возился с ним. Я не настроил фильтры, но дам вам идею. Благодаря! – Tony

+0

@Tony - для фотографии ваша самая большая проблема, вероятно, будет использовать память, поэтому все, что требует большого количества проходов рендеринга, может быть неприятным. Возможно, вы сможете очистить некоторый шум от обнаружения порогового края с помощью фильтра открытия (или закрытия, иногда я получаю эти два смешения) с меньшим радиусом. –

+0

@BradLarson можно применить фильтр обнаружения пороговых границ к видеокамере, но вместо черного и белого я должен указать свой собственный RGB на края и фон? – Yadnesh

Смежные вопросы