使用surf创建带有透明背景的png文件的3D图像

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生成surf图,结果不是透明的。您有什么想法我做错了什么?

请将代码行缩进四个空格以获得良好的格式。 - DarenW
1个回答

3

在MATLAB中有一个名为alpha的函数,用于设置当前坐标轴中对象的透明度。建议通过替换以下行来更改名为alpha的变量名称。

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

to

[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'获得的图像

更多细节。希望这能有所帮助!


1
感谢您的回复,Victor Hugo。然而,我想要的结果是黑色边框处的透明度设置为0,而其他地方(蓝色框)的透明度设置为1。Alpha和/或Facealpha将整个矩阵的透明度设置为相同的值。我希望能够告诉surf使用alpha矩阵而不仅仅是标量值。希望这样说得清楚。 - hkf
所以我正在尝试使用这种技术将图像放置在实际表面绘图上,该绘图具有类似于此的高程数据:https://dev59.com/_3A65IYBdhLWcg3wogAb 如何防止高程数据受到影响? - user1854628
@user1854628,你发给我的例子中的“高程数据”是什么?它是图像周围的球体吗? - Yamaneko

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接