如何在Matlab中对多个图像进行平均?

4
我试图从1000帧中获取平均图像。
每个图像的大小为512×512像素。我从实验中得到的文件是tiff单位16数据。
tiff文件包含相同位置的1000帧。
我想编写一个m文件,在其中从tiff文件中读取1000帧,然后对它们进行平均,但似乎会非常快地消耗内存。
有什么更好的方法来获取这1000帧的平均图像?如果唯一的方法是在将所有帧加载到matlab之后进行平均,那么应该如何对1000帧进行平均?
谢谢。
6个回答

4

请尝试以下方法:

a=zeros(512);
for i=1:1000
    a=a+frame(i);
end
a=a/1000;

a是帧的平均值。


2

每读取一张图片,您可以将其累加到临时变量中,即在每个步骤中将当前图像添加到此变量中。在读取所有图像后,累加器将存储所有图像的总和。最后,将其除以图像数量,就可以得到最终图像。

但是要注意的是,图像通常以uint8(无符号8位整数)的形式存储。如果将它们加起来,就会发生溢出。为了防止这种情况,累加器应该使用uint32或double类型。如果想要最终图像是uint8,则需要进行显式转换。


嗨,user502144,感谢您的快速回复。我想在平均处理后将文件保存在第16单元。我不太明白您所说的临时变量是什么意思,具体怎么做呢? - tytamu

1
source = 'D:\file_path\'; %'
im_number=262; % image number should not exceed 16 843 009 images
sum=uint32(imread([source,'image1.bmp'],'bmp')); % converts image array to Unsigned 32-bit integer to escape overflow
  for n=2:im_number;
      sum=imadd(sum,uint32(imread([source,'image', num2str(n),'.bmp'],'bmp'))); % perform addition without overflow
%      using images specific function imadd
  end;
  sum = imdivide(sum,im_number); % performing normalization of addition using images specific function imdivide
  imshow(uint8(sum),[]); % displais the image converted back to Unsigned 8-bit integer
  imwrite(uint8(sum),[source,'sum_image.bmp'],'bmp');  % saves the averaged image

1
% slight modiifcations to the last answer
if the files are named image1.tif, image2.tif,....image1000.tif)
im = imread('image1.tif');
for i = 2:1000
im = imadd(im,imread(sprintf('image%d.tif',i)));
end
im = im/1000;
imshow(im,[]);

当你有像image00001、image00002、...、image00010、...、image00100这样的名称时,问题就变得有趣了。在一个循环中读取2-10,在另一个循环中读取11-99,以此类推...希望这可以帮到你。

为什么最终的平均图像很暗? - NKN
这取决于您如何显示图像。如果您的图像的位深度(灰度范围)大于您的查看器(或屏幕)可以显示的位深度,则您将看不到任何内容。请尝试使用ImageJ显示您的图像以进行检查。 - LeChat

0
% assuming there are files named: '1.tif','2.tif',...'1000.tif'
im = imread('1.tif');
for i = 2:1000
 im = imadd(im,imread(sprintf('%d.tif',i)));
end
im = im/1000;
imshow(im,[]);

-1
J=0;
for i =1:index %index is the number of images to be averaged
    I=uint32(imread(['frame',num2str(i),'.bmp']));
    J=imadd(I,J);
end
J=floor(J/index);
J=uint16(J); %J is the required image

1
请描述您的回答 - jansepke

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接