使用Videowriter / avi文件编写灰度视频

时间:2014-07-21 19:35:02

标签: image matlab image-processing video-processing movie

我正在编写一个函数,可以生成一个模仿流体中粒子的电影。这部电影是彩色的,我想在一开始就制作一部灰度电影。现在我使用的是avifile而不是videowriter。有关更改此代码以获取灰度电影的任何帮助吗?提前谢谢。

close all;
clear variables;
colormap('gray');

vidObj=avifile('movie.avi'); 
for i=1:N    
[nx,ny]=coordinates(Lx,Ly,Nx,Ny,[x(i),-y(i)]);
[xf,yf]=ndgrid(nx,ny);
zf=zeros(size(xf))+z(i);    

% generate a frame here
[E,H]=nfmie(an,bn,xf,yf,zf,rad,ns,nm,lambda,tf_flag,cc_flag);
Ecc=sqrt(real(E(:,:,1)).^2+real(E(:,:,2)).^2+real(E(:,:,3)).^2+imag(E(:,:,1)).^2+imag(E(:,:,2)).^2+imag(E(:,:,3)).^2);
clf
imagesc(nx/rad,ny/rad,Ecc); 
writetif(Ecc,i);
    if i==1
    cl=caxis;
    else
    caxis(cl)
    end
axis image;
axis off;
frame=getframe(gca);
cdata_size = size(frame.cdata);  
data = uint8(zeros(ceil(cdata_size(1)/4)*4,ceil(cdata_size(2)/4)*4,3));
data(1:cdata_size(1),1:cdata_size(2),1:cdata_size(3)) = [frame.cdata];
frame.cdata = data; 
vidObj = addframe(vidObj,frame);
end
vidObj = close(vidObj);

1 个答案:

答案 0 :(得分:1)

对于您的帧数据,请使用rgb2gray将彩色帧转换为其灰度对应帧。因此,请更改此行:

data(1:cdata_size(1),1:cdata_size(2),1:cdata_size(3)) = [frame.cdata]; 

这两行:

frameGray = rgb2gray(frame.cdata);
data(1:cdata_size(1),1:cdata_size(2),1:cdata_size(3)) = ...
     cat(3,frameGray,frameGray,frameGray);

新代码的第一行会将您的颜色框转换为单通道灰度图像。在彩色方面,灰度图像具有所有通道的所有相同值,这就是第二行cat(3,frameGray,frameGray,frameGray);被调用的原因。这将灰度图像的三个副本堆叠在一起作为3D矩阵,然后您可以将此帧写入您的文件。

您需要进行此叠加,因为在使用VideoWriter将帧写入文件时,帧必须为颜色(例如,3D矩阵)。因此,如果要将灰度帧写入文件,唯一的解决方法是将灰度图像复制到每个红色,绿色和蓝色通道中,以创建其颜色等效颜色。

BTW,cdata_size(3) 始终为3,因为getframe的{​​{1}}结构始终返回3D矩阵。

祝你好运!