3

问题:使用 surf 绘图时图像失去透明度

我已经想出了如何创建具有透明背景的 png 文件,如许多其他线程中所述。这里

但是,当使用 surf.m 绘图时,图像不透明

这是我到目前为止的代码:

img = imread('image.png');

A1 = ones(size(img));A2 = ones(size(img));A3 = ones(size(img));
A1(img(:,:,1)==0)=0;A2(img(:,:,2)==0)=0;A3(img(:,:,3)==0)=0;

A = A1+A2+A3;
A= A(:,:,1);

imwrite(img,'test.png','alpha',A);
[img,map,alpha] = imread('test.png');

ximage = [-.5,.5;-.5,.5];
yimage = [0,0;0,0];
zimage = [.5,.5;-.5,-.5];

surf(ximage,yimage,zimage,'Cdata',img,'Facecolor','texturemap','Edgecolor','none','alphadata',alpha);
axis vis3d

该代码将 image.png(蓝色方块)转换为具有透明背景的 test.png(摆脱黑色背景)。然后使用 test.png 生成一个不透明的冲浪图。知道我做错了什么吗?

黑色背景的蓝色正方形 - 需要将其绘制为没有黑色背景的 3D 切片

4

1 回答 1

3

在 MATLAB 中调用了一个函数alpha,它为当前坐标区中的对象设置透明度。我建议alpha通过替换以下行将命名的变量更改为另一个名称

[img,map,alpha] = imread('test.png');

[img,map,alphaChannel] = imread('test.png');

现在,运行后surf,您可以通过alpha函数设置绘图的透明度。

使用alpha功能

surf(ximage,yimage,zimage,'Cdata',img,'Facecolor','texturemap','Edgecolor', ...
                          'none','alphadata',alpha);
alpha(0.5); %# line added
axis vis3d

使用surf功能

如果要通过surf函数设置透明度,需要添加'FaceAlpha'参数:

surf(ximage,yimage,zimage,'Cdata',img,'Facecolor','texturemap','Edgecolor', ... 
                          'none','AlphaData',alphaChannel,'FaceAlpha',0.5);

结果

通过上述任何示例获得的图像

有关alphasurf功能的更多信息。


设置矩阵透明度

但是上面的那些函数设置了整个图的透明度。如果要设置原始透明度矩阵,则需要将'FaceAlpha','texture'参数传递给surf

handler = surf( ximage , yimage , zimage , 'Cdata', img , ...
    'FaceColor','texturemap',                             ...
    'EdgeColor','none',                                   ... 
    'FaceAlpha','texture',                                ...
    'AlphaData', alphaChannel);
axis vis3d

结果

通过设置'FaceAlpha'获得的图像

更多细节。希望能帮助到你!

于 2012-08-16T02:16:34.707 回答