在Matlab中从补丁对象创建一个位图

时间:2014-09-08 13:29:12

标签: matlab bitmap matlab-figure

我在X,Y矩阵中有一组多边形顶点,它们的颜色在另一个矩阵C中的RGB值中。

然后我使用fill()函数生成在Matlab图中显示的补丁对象。

我想从这个图中创建一个bmp对象。我对bmp对象的意思是像素的x,y坐标和RGB值。

如果我使用print()函数,使用'-dbmp'和文件名,matlab可以将bmp写入文件。但后来我必须用imread()读取文件来创建bmp对象。

有没有办法在不写文件的情况下创建bmp对象?

Becauswe我必须多次执行此操作,写入和读取文件非常耗时,我猜也会缩短磁盘的使用寿命。

编辑:根据答案编辑后的代码

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');
    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');
        hold on;
    end
    %print(h,'-dbmp',['-r' num2str(res)],['file' num2str(c2)]);
    F = getframe(h);
    [a, b] = frame2im(F);

    Tmp_v1 =  a;
    Tmp_v1 = Tmp_v1(:);
    Norm_v1(c2) = norm(single(Tmp_v1));
end

谢谢。

1 个答案:

答案 0 :(得分:0)

如果你打开当前的数字,你可以尝试getframe成语。一旦有权访问,您可以通过查看结构中的cdata字段来访问框架的图像数据。完成后,您可以使用MATLAB图像处理工具箱中的imwrite命令(希望您拥有它......)将图像写入文件。

以下是一个例子:

x = 1 : 5;
y = 1 : 5;
plot(x,y); %// Plot a line
h = getframe;
img = h.cdata;
imwrite(img, 'testFrame.bmp');

这应该能够抓住当前图中的内容并将其保存到文件中。在这种情况下,这将是从(x,y) = (1,1)(x,y) = (5,5)的直线,斜率为1.请记住,这不会保存图形或轴的标题。这只会抓取帧内渲染的内容。


从评论中编辑

现在我知道你真正想要的是什么,你想要生成一堆随机多边形,然后只提取核心图像,没有任何轴或刻度线等等。你必须修改你创建图像的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

    Tmp_v1 =  a;
    Tmp_v1 = Tmp_v1(:);
    Norm_v1(c2) = norm(single(Tmp_v1));
end

这仍然会显示正在为您正在创建的每个图像弹出的帧,但此时您应该能够获得纯粹的图像数据。请注意,图像仍然比400 x 400略大。这是因为一旦我们移除了边框和刻度线等,图形将拉伸以填充整个图形。为了解决这个问题,我使用imresize并根据您所需的尺寸将图片缩小到400 x 400

另外,请注意,每次生成新图像时,都会生成一个新图形。每次调用getframe时,弹出带有此随机生成的多边形图像的图形,getframe拍摄当前帧的快照。没有办法防止这种情况发生,因为你将无法拍摄该数字的快照。解决这个问题的一种方法是在抓取图像后关闭图形。每次致电close all;后,您都可以getframe。这样,任何时候都只会显示一个数字,但这仍然不会阻止数字出现。

如果我找到了解决方法,我会告诉你的!