2017-02-09 4 views
0

Я пытаюсь подражать функциональности альфа-компоновки в Matlab или, более конкретно, создавать типы CopyOpacity и Over из ImageMagick. Первая цель - замаскировать область с большими краями сглаживания, такими как черные области на изображениях в наборе (image set with aliasing edges). Это должно быть сделано с совместимой маской шкалы серого, чтобы черные области были устранены, а белый должен быть сохранен, см. gray scale mask. Важным является непрерывный переход между черным и белым, что приводит к непрерывному переходу между прозрачным и непрозрачным, см. screenshot with transparent regions).Matlab: Alpha-Compositing с серой маской

Существует два подхода к составлению переднего плана FG с фоном BF с маской CM_mask_blur_alpha с серой шкалой, но результаты были не такими, как ожидалось (см. image set with post-processing с ImageMagick в качестве ссылки для чистой процедуры Matlab).

1) В первом коде серая шкалы маска неожиданно рассматриваются как бинарная маска, в результате неприемлемых эффектов наложения спектров на краях бывшего черных областей (image set for first approach):

FG = uint8(CM_mask_blur_alpha .* FG + (1 - CM_mask_blur_alpha) .* BG); 

2) Второй подход приводим к видимому непрерывному переходу между передним планом и фоном, но есть эффект наложения спектров от FG оставшегося (image set for second approach):

FG = uint8(bsxfun(@times, CM_mask_blur_alpha, FG) + bsxfun(@times, (1 - CM_mask_blur_alpha), BG)); 

кажется, что один шаг подход не работает так, Я ищу двухступенчатый подход, например, в ImageMagick с маскировкой из черных областей, что приводит к промежуточному изображению с прозрачностью и в качестве второго шага составляют это промежуточное изображение на фоне. Отчасти это проблема, как в MATLAB: Applying transparent mask over an RGB image and blending with another, но нет маски маску серого, и я не мог адаптировать части решения, такие как генерация альфа-канала со значениями, полученными из серой маски.

ответ

0

Оказалось, что проблема заключается не в композиции, а в маске. Если маска увеличена с морфологической операцией (imdilate) с огромным значением (se = strel («диск», 9)), а затем размытым (imgaussfilt) с относительно большим значением (например, сигма = 3), сглаженные края были замаскированы с плавным переходом.

whiteImage = 255 * ones(cm_out_h, cm_out_h, 'uint8'); 
conformal = maketform('custom', 2, 2, [], @conformalInverse_0001, []); 
CM_mask = imtransform(whiteImage, conformal, ..., 'FillValues', 0); 
% MORPHOLOGY: ENLARGE BLACK WITH imdilate 
CM_mask = imcomplement(CM_mask); 
se = strel('disk',9); 
CM_mask = imdilate(CM_mask,se); 
CM_mask = imcomplement(CM_mask); 
% BLUR 
CM_mask_blur = imgaussfilt(CM_mask, 3);  
% ALPHA 
CM_mask_blur_alpha = double(CM_mask_blur)/255; 
CM_mask_blur_alpha = im2double(CM_mask_blur_alpha); 
Смежные вопросы