2017-02-09 14 views
0

Matlabでアルファ合成の機能をエミュレートしようとしています。より具体的には、CopyOpacityとOver ImageMagickの作成タイプです。第1の目標は、セット(image set with aliasing edges)の画像内の黒い領域のようなエイリアスの多いエッジをマスクすることです。これは、互換性のあるグレースケールマスクを使用して行う必要があります。黒の領域を削除し、白を保存する必要があります。gray scale maskを参照してください。重要なのは、白と黒の連続的な遷移で、透明と不透明の連続的な遷移になります。screenshot with transparent regions)を参照してください。Matlab:グレースケールマスクを使用したアルファ - 合成

グレースケールマスクCM_mask_blur_alphaを使用してフォアグラウンドFGとバックグラウンドBFを作成するには2つの方法がありましたが、結果は期待どおりではありませんでした(純Matlabプロシージャの参考資料としてImageMagickを参照してください)。

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

2)第二のアプローチ:グレイスケールマスクが予期せず、以前のブラック領域のエッジにおける許容できないエイリアシング効果が得られるバイナリマスク(image set for first approach)として扱われる最初のコードで

1)前景と背景との間の可視連続的な移行をもたらすが、残りのFG(image set for second approach)からエイリアシング効果がある。

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

一段階アプローチはそう動作していないと思われます私はImageMagickのような2段階のアプローチを探しています。黒い領域をマスクして中間色の画像を透明にし、第2のステップとしてこの中間の画像をバックグラウンドで作成します。部分的には MATLAB: Applying transparent mask over an RGB image and blending with anotherのような問題設定ですが、グレースケールマスクはありません。グレーマスクから派生した値を持つアルファチャンネルの生成のような解決策を適用することはできませんでした。

答えて

0

問題は合成部分ではなくマスクであることが分かりました。マスクが巨大な値(se = strel( 'disk'、9))を持つ形態学演算(imdilate)で拡大され、比較的大きな値(sigma = 3など)でぼかし(imgaussfilt)スムーズな移行が可能です。

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); 
関連する問題