从一组三角形创建一个位图:Matlab

时间:2014-09-08 18:50:49

标签: matlab bitmap

我有一组三角形,由3(x,y)坐标定义。 x轴从0到2,y轴也是相同的尺寸(单位是英寸)。

每个三角形都有一个RGB值。

我想将每个三角形呈现在彼此之上(顺序并不重要),然后创建一个大小为400乘400像素的位图图像(因为我的x和y是2英寸长,每英寸200像素)。

我的方法如下,但我希望我的解决方法不会给读者的意见增色。重要的是问题。

我的方法:我使用matlab的fill()函数从每个三角形制作补丁对象并绘制它们。然后使用getframe()从matlab图中制作一个位图。问题是,我的图形周围有一个白色边距,尺寸为420 x 560像素。我的代码如下。

如果使用fill()和getframe()是解决此问题的唯一方法,请指出错误。我希望有一种方法可以在不使用getframe()的情况下解决问题。感谢。

P.S。我之前的问题是关于getframe()Create a bitmap from patch object in 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

2 个答案:

答案 0 :(得分:0)

您可以为getframe函数指定第二个参数,指示您想要的裁剪矩形。只需弄清楚你图形感兴趣区域的边界。

有关详细信息,请参阅help getframe

答案 1 :(得分:0)

您必须修改用于创建图像的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拍摄当前帧的快照。没有办法防止这种情况发生,因为你无法拍摄这个数字的快照。解决这个问题的一种方法是在抓取图像后关闭图形。每次致电close all;后,您都可以getframe。这样,任何时候都只会显示一个数字,但这仍然不会阻止数字出现。

如果我确实找到了解决方案,我会告诉您!