2013-05-30 3 views
1

Я получил черно-белое изображение из фильтра обнаружения края в GPUImage, где белый представляет края, а большая часть содержимого изображения черная, непрозрачная. Проблема в том, что я хочу наложить это изображение поверх другого изображения, чтобы показать, как края выравниваются с изображением ниже.Конвертировать черно-белое изображение в прозрачное и белое изображение в GPUImage? RGB -> Alpha в основном

Но область без края не прозрачна, а черна, поэтому в основном я хочу, чтобы черный был прозрачным или менял интенсивность черноты и белизны на интенсивность прозрачности.

Я не нашел прямой фильтр GPUImage для этой задачи преобразования. Очевидно, что GPUImageChromaKeyFilter - это способ сделать это, но это больше, чем преобразование канала RGB в Alpha, и не предназначено для этой задачи.

ответ

3

Редактировать: Благодаря комментарию Брэда более эффективное решение без замены канала заменяет «gl_FragColor = vec4 (vec3 (mag), 1.0);» с "gl_FragColor = vec4 (mag);" в источнике фильтра обнаружения края.

Вы можете играть с параметрами в GPUImageColorMatrixFilter и отображать каналы из одного в другой. Пример код:

GPUImagePicture *gpuImage = [[GPUImagePicture alloc] initWithImage:image]; 
GPUImageSobelEdgeDetectionFilter *edgeFilter = [[GPUImageSobelEdgeDetectionFilter alloc] init]; 

GPUImageColorMatrixFilter *conversionFilter = [[GPUImageColorMatrixFilter alloc] init]; 
conversionFilter.colorMatrix = (GPUMatrix4x4){ 
    {0.0, 0.0, 0.0, 1.0}, 
    {0.0, 0.0, 0.0, 1.0}, 
    {0.0, 0.0, 0.0, 1.0}, 
    {1.0,0.0,0.0,0.0}, 
}; 

[gpuImage addTarget:edgeFilter]; 
[edgeFilter addTarget:conversionFilter]; 
[gpuImage processImage]; 

return [conversionFilter imageFromCurrentlyProcessedOutputWithOrientation:orientation]; 

Значение, указанное в ColorMatrix в основном говорит, используя предыдущий канал Alpha (все 255 для не прозрачного изображения), чтобы заменить RGB каналов, и используя предыдущий R канал (черно-белые изображения имеют те же значения в RGB) для замены альфа-канала.

+1

Более эффективным процессом может быть создание собственного подкласса GPUImageSobelEdgeDetectionFilter и предоставление настраиваемого шейдера фрагментов, который также улучшает альфа-канал в ответ на силу края. Для основного вам нужно просто скопировать шейдер фрагмента Sobel и заменить 'gl_FragColor = vec4 (vec3 (mag), 1.0);' с 'gl_FragColor = vec4 (mag);' Это удаляет дополнительную память и обработку второй фильтр регулировки цвета. Смешивание непрозрачности позаботится обо всем остальном. –

+0

@BradLarson Просто проверено и работает. Спасибо за ваш комментарий и ваш потрясающий проект! –