MATLAB灰度图像生成gif

作者:liuz_notes
来源:CSDN
原文:https://blog.csdn.net/liuz_notes/article/details/83690508
版权声明:本文为博主原创文章,转载请附上博文链接!


MATLAB灰度图像生成gif

前言

    问题来源于我想要制作一个三维图像的某一个维度的所有切片图组合而成的gif。首先在网上查阅资料发现现有的方法是用getframe函数来实现,但是这样出来的gif会有白色边框,我只想要纯图像的gif,经过简单的思考,得到了一种新的方法。现将两种方法总结如下:

getframe截屏法(Reference)

    这种方法的思想就是利用一个帧数循环,将每一帧的图像在figure界面中不断地更新,同时用getframe函数截取当前figure窗口的图像,类似于QQ截屏(Ctrl+Alt+A)。然后利用frame2im函数将截屏转化为图像,最后用rgb2ind将其转化为索引图,逐帧保存即可。索引图即为gif的帧图,想了解更多可以自行百度,这里不多赘述。
    遗憾的是这个函数的截屏会额外截取figure窗口的空白部分,也就是说你的图像矩阵会比原来的大,且维数不相等。当然,因为我是做纯图像处理,引入了空白部分对我有很大影响。但是如果你是想动态绘制函数图形,并保存为gif,大可随便使用。
下面给出灰度图像gif实例:

for pic_num = 1:128
    figure(1);
    imshow(I(:,:,pic_num));
    drawnow;
    F = getframe(gcf);
    Gif = frame2im(F);
    [Gif,map]=rgb2ind(Gif,256);
    if pic_num == 1
        imwrite(Gif,map,'C:\Users\DELL\Desktop\test.gif','gif', 'Loopcount',inf,'DelayTime',0.05);
    else
        imwrite(Gif,map,'C:\Users\DELL\Desktop\test.gif','gif','WriteMode','append','DelayTime',0.05);
    end
end


然后是我用以上方法生成的gif

    可以看到,正方形图像周围有灰色边框,这就是getframe函数所截取的窗口大小。


图像矩阵处理法(My Method)

    因为我要处理的是灰度图像,不像RGB图像能直接调用rgb2ind函数,生成gif帧图。所以我查遍了网络,发现并没有从灰度图转RGB的方法,这是因为RGB图像有三原色通道,也就是说如果是一副二维图像,灰度图只是一个二维矩阵,而RGB图是一个三维矩阵,第三维则记录了R、G、B三色通道信息。
    rgb2ind函数的输入参数要求是三维的uint8类型数据,而我只有二维灰度图,这怎么办呢?
    一个思路是用三个变量分别复制灰度图信息,然后再将其合并为一个变量,这样就得到了三维数据。然后将此三维数据用uint8()强制转换为uint8类型。至此,我们就得到了rgb2ind函数的参量,可以生成gif了。
    此外,可以用任意的一系列二维矩阵生成gif,只需要对二维矩阵调用mat2gray(),将矩阵归一化生成灰度图,然后按照上述处理即可。

一个插曲:我原本的数据类型是double,强制转换为uint8类型后图像数据丢失,像素值全变成了0,gif漆黑一片。然后我把没有强制类型转换的变量作为rgb2ind参量,程序并没有报错,而且正常生成了gif。所以根据自己的需要强制类型转换。


代码如下:

for pic_num = 1:128
    [rows,cols]=size(I(:,:,pic_num));
    r = zeros(rows,cols);
    g = zeros(rows,cols);
    b = zeros(rows,cols);
    r = double(I(:,:,pic_num));
    g = double(I(:,:,pic_num));
    b = double(I(:,:,pic_num));
    rgb = cat(3,r,g,b);
%     rgb = uint8(cat(3,r,g,b));
    [Gif,map]=rgb2ind(rgb,256);
    if pic_num == 1
        imwrite(Gif,map,'C:\Users\DELL\Desktop\test.gif','gif', 'Loopcount',inf,'DelayTime',0.05);
    else
        imwrite(Gif,map,'C:\Users\DELL\Desktop\test.gif','gif','WriteMode','append','DelayTime',0.05);
    end
end

这样就得到了我想要的无边框图像的gif了。
在这里插入图片描述


    关于gif的delay时间,我最小只设置到了0.005s,如果再小图像的更新时间会突然变得很长。delay时间的极限还有待探讨。

结语

    至此,整篇博客就结束了,这是我的第一篇博客,以后我会将我的学习经验体会以博客的形式展示出来,用以见证我的成长。Linux之父Linus Torvalds说过一句非常经典的话:

“Talk is cheap. Show me the code.”

    

参考资料

  1. https://blog.csdn.net/lusongno1/article/details/78632457
  2. https://blog.csdn.net/u012260117/article/details/70624764
发布了14 篇原创文章 · 获赞 6 · 访问量 2197

猜你喜欢

转载自blog.csdn.net/liuz_notes/article/details/83690508