我正在编写一个函数,可以生成一个模仿流体中粒子的电影。这部电影是彩色的,我想在一开始就制作一部灰度电影。现在我使用的是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);
答案 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矩阵。