我有一组三角形,由3(x,y)坐标定义。x轴是从0到2,y轴也是相同的大小(单位为英寸)。
每个三角形都有一个RGB值。
我想渲染每个三角形(顺序无关紧要),然后创建一个大小为400乘400像素的位图图像(因为我的x和y是2英寸长,每英寸200像素)。
下面给出了我的方法,但我希望我的解决方法不会影响读者的意见。重要的是问题。
我的方法是:我使用matlab的fill()函数从每个三角形中制作面片对象并绘制它们。然后使用getframe()从matlab图形中制作位图。问题是,我的图形周围有一个空白,尺寸是420乘560像素。我的代码如下。
如果使用fill()和getframe()是解决此问题的唯一方法,请指出错误。我希望有一种方法可以在不使用getframe()的情况下解决这个问题。谢谢
附言:我之前的问题是关于getframe()在Matlab中从补丁对象创建位图
N = 5;
Tri = 100;
res = 200; %200 pixles per inch
G = zeros(Tri,9,N);
X = 2*rand(Tri,3,N);
Y = 2*rand(Tri,3,N);
R = randi([0 255],Tri,N)/255;
G = randi([0 255],Tri,N)/255;
B = randi([0 255],Tri,N)/255;
for c1=1:N
G(:,1:3,c1)= X(:,:,c1);
G(:,4:6,c1)= Y(:,:,c1);
G(:,7,c1)= R(:,c1);
G(:,8,c1)= G(:,c1);
G(:,9,c1)= B(:,c1);
end
for c2=1:N;
h = figure('Visible','off');
for c3 =1:Tri
h1 = fill(G(c3,1:3,c2), G(c3,4:6,c2), [G(c3,7,c2) G(c3,8,c2) G(c3,9,c2)]);
set(h1,'EdgeColor','None');
hold on;
end
set(gcf, 'PaperUnits', 'inches', 'PaperPosition', [0 0 400 400]/res, 'visible','off');
set(gca,'visible','off');
F = getframe(h);
[a, b] = frame2im(F);
end
您必须修改创建图像的for
循环,以便图形填充整个窗口而不使用任何灰色填充。您还需要关闭轴。此外,在生成每个图像时,需要关闭记号。这是通过不写任何刻度标签以及将刻度长度设置为0来完成的。换句话说,您需要修改代码,使其看起来像这样。通过查看代码中的%// NEW
语句,您将看到我插入代码的位置:
for c2=1:N;
h = figure('Visible','off');
subplot('position', [0 0 1 1]); %// NEW
axis off; %// NEW
set(h, 'PaperUnits', 'inches', 'PaperPosition', [0 0 400 400]/res);
for c3 =1:Tri
h1 = fill(G(c3,1:3,c2), G(c3,4:6,c2), [G(c3,7,c2) G(c3,8,c2) G(c3,9,c2)]);
set(h1,'EdgeColor','None');
set(gca,'xcolor','w','ycolor','w','xtick',[],'ytick',[]) %// NEW
set(gca,'Ticklength',[0 0]); %// NEW
hold on;
end
%print(h,'-dbmp',['-r' num2str(res)],['file' num2str(c2)]);
F = getframe(h);
close all; %// NEW
[a, b] = frame2im(F);
a = imresize(a, [400 400], 'nearest'); %// NEW
end
这仍然会为您创建的每个图像显示弹出的帧,但此时您应该能够获得纯图像数据。注意,图像仍然显示为比400 x 400
大一点。这是因为,一旦我们删除了边框和勾号等,图形将拉伸以填充整个图形。为了避免这种情况,我使用imresize
,并根据您的期望大小将图像缩小到400 x 400
。此外,请注意,每次生成新图像时,都会生成一个新图形。每次调用getframe
时,都会弹出带有此随机生成的多边形图像的图形,getframe
会拍摄当前帧的快照。没有办法阻止这种情况的发生,因为你将无法拍摄该人物的快照。绕过这种情况的一种方法是在拍摄完图像后关闭该人物。您可以在每次调用getframe
之后执行close all;
。这样,一次只显示一个图形,但这仍然不会阻止该图形的显示。
如果我真的找到了解决方案,我会告诉你的!
您可以为getframe
函数提供第二个参数,指示所需的裁剪矩形。只要找出你的人物感兴趣的区域的边界就可以了。
详见help getframe
。