Преобразовать черно-белое изображение в прозрачно-белое изображение в GPUImage? RGB -> Альфа в основном

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

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

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


person X.Y.    schedule 30.05.2013    source источник


Ответы (1)


Редактировать: благодаря комментарию Брэда более эффективным решением без замены канала является замена "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, в основном говорят об использовании предыдущего альфа-канала (все 255 для непрозрачного изображения) для замены каналов RGB и использовании предыдущего канала R (черно-белые изображения имеют одинаковые значения в RGB) для замены альфа-канала. .

person X.Y.    schedule 30.05.2013
comment
Более эффективным процессом может быть создание собственного подкласса GPUImageSobelEdgeDetectionFilter и предоставление пользовательского фрагментного шейдера, который также настраивает альфа-канал в ответ на силу края. Для базового вам нужно просто скопировать фрагментный шейдер Собеля и заменить gl_FragColor = vec4(vec3(mag), 1.0); на gl_FragColor = vec4(mag); Это уберет лишнюю память и обработку второго фильтра настройки цвета. Об остальном позаботится смесь непрозрачности. - person Brad Larson; 31.05.2013
comment
@BradLarson Только что протестировал и сработал. Спасибо за ваш комментарий и ваш замечательный проект! - person X.Y.; 31.05.2013