| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253 | function [ imageO, alphaO ] = imblend ( imageA, alphaA, imageB, alphaB )%IMBLEND Combine image A and B with alpha channels% Usage:%     [ X ] = imblend ( imageA, alphaA, imageB, alphaB )% Input:%     imageA, imageB = MxNx3 CDATA%     alphaA, alphaB = scalar or MxN alpha map%     imageA in front, imageB in the back% Output:%     X = X%% See also imagescX%% Copyleft 1999-, XMO.% check inputif any(alphaA(:) < 0) || any(alphaA(:) > 1) || any(alphaB(:) < 0) || any(alphaB(:) > 1)    error('alpha should be within [0 1]');endif size(imageA, 3) ~= 3 && size(imageB, 3) ~= 3    error('unknown input image format');endif size(imageA) ~= size(imageB)    error('image dimension mismatch');endif isscalar(alphaA)elseif size(alphaA, 1) == size(imageA, 1) && size(alphaA, 2) == size(imageA, 2) && size(alphaA, 3) == 1else    error('inappropriate alphaA');endif isscalar(alphaB)elseif size(alphaB, 1) == size(imageB, 1) && size(alphaB, 2) == size(imageB, 2) && size(alphaB, 3) == 1else    error('inappropriate alphaB');end% return directly if completely transparentif all(alphaA(:) == 0) && all(alphaB(:) == 0)    imageO = zeros(size(imageA));    return;end% calculate alphaalphaO = alphaA + alphaB .* (1 - alphaA);% calculate imageimageO = zeros(size(imageA), class(imageA));for i = 1:3    imageO(:,:,i) = (imageA(:,:,i) .* alphaA + imageB(:,:,i) .* alphaB .* (1 - alphaA)) ./ alphaO;end
 |