显示没有背景的png图像

时间:2014-04-18 18:58:47

标签: matlab image-processing png

http://sweetclipart.com/multisite/sweetclipart/files/sunglasses_black.png

我使用[X,map,alpha]=imread('...','png')在MATLAB中读取了png图像。 现在我想把这个png图像放在另一个图像上。但是我希望不显示读取png的背景颜色。在链接中,我希望单独使用太阳镜而不使用白色'背景(背景是另一个图像)。

3 个答案:

答案 0 :(得分:1)

Alpha通道是不透明的,与透明度相反。

MATLAB数据通过AlphaData属性支持alpha混合:

background = uint8(255*rand(size(alpha)));
imshow(background)
hold on
h = imshow(X);
set(h, 'AlphaData', alpha)

结果: enter image description here

鉴于另一张图片Y和您的图片X及其alpha数据,您可以使用alpha生成混合图片。在您的情况下,alpha只有值0和255,但通常可以有不透明度级别。在这个简单的情况下,再次使用噪声背景,但颜色:

out = uint8(255*rand(size(X))); % Y
hardMask = repmat(alpha==255,1,1,3);
out(hardMask) = X(hardMask);
imwrite(out,'sunglass_alphaC.png')

这是一个很大的图像,所以我在这里调整了输出的大小:

enter image description here

如果您的Alpha通道实际上有两个以上的透明度级别,您可以与背景混合:

s = double(alpha)/255;
Yout = uint8((bsxfun(@times,1-s,double(Y)) + bsxfun(@times,s,double(X))));

对于灰度,bsxfun只能替换为.-(例如s.*double(X))。

答案 1 :(得分:0)

我不太了解Matlab,但似乎是[X,map,alpha]使用" alpha"作为alpha通道; alpha通道意味着透明度。 (可能你已经知道了)。同时检查图像本身是否设置了alpha通道。 PNG不承认" white"默认为alpha通道。在这种情况下,去你最喜欢的" *商店"用于编辑照片的软件(可能选择使用魔术工具作为背景,选择反转,复制粘贴到之前指定背景图像为透明的新图像)。

答案 2 :(得分:0)

你可以这样做:

% Image with alpha channel
[glasses, ~, alpha] = imread('http://sweetclipart.com/multisite/sweetclipart/files/sunglasses_black.png');

% OPTIONAL: Let's rescale it (it's very big!)
glasses = imresize(glasses, 0.1);
alpha = imresize(alpha, 0.1);

% An image of a person (let's put the glasses on the person).
person = imread('http://cinemacao.com/wp-content/uploads/2013/12/Scarlett-CAPA-2.jpg');

% Lets make the alpha MxNx3 (so we can combine it with the RGB channels).
alpha = repmat(alpha, [1 1 3]);

% And convert everything from uint8 to double (to avoid precision issues).
glasses = im2double(glasses);
alpha = im2double(alpha);
person = im2double(person);

% Final image

% Let x,y be the top-left coordinates where we'll put the glasses.
x = 440;
y = 450;

% Let's combine the images.
img3 = person;
img3(y:y+size(glasses,1)-1, x:x+size(glasses,2)-1, :) = ...
    glasses .* alpha + ...
    person(y:y+size(glasses,1)-1, x:x+size(glasses,2)-1, :) .* (1 - alpha);

% An display the result.
imshow(img3);

结果: enter image description here