Как усреднить несколько изображений в Matlab? - PullRequest
4 голосов
/ 17 апреля 2011

Я пытаюсь получить среднее изображение из 1000 кадров.

  • Каждое изображение имеет размер 512 на 512 пикселей. Файл, полученный в ходе экспериментов, представляет собой данные в формате TIFF 16.
  • Файл TIFF содержит 1000 кадров одного и того же пятна.

Я думал написать файл, в котором я считал 1000 кадров из файла TIFF, а затем усреднил их, но, похоже, очень быстро поглотит память.

Какой лучший способ получить среднее изображение из этих 1000 кадров.Если единственный способ - это усреднить их после загрузки всех кадров в Matlab, как мне следует усреднить более 1000 кадров?Благодарю.

Ответы [ 6 ]

3 голосов
/ 17 апреля 2011

попробуйте следующее:

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

a - среднее значение кадров.

2 голосов
/ 17 апреля 2011

После считывания каждого изображения вы можете накапливать его во временной переменной, то есть добавлять текущее изображение в эту переменную на каждом шаге. После того, как вы прочитаете все изображения, аккумулятор будет хранить сумму всех изображений. Наконец, разделите его на количество изображений, и вы получите окончательное изображение.

Но важно, что изображения обычно хранятся как uint8 (8-разрядное целое число без знака). И если он будет суммирован, произойдет переполнение. Для предотвращения этого аккумулятор должен быть, например. uint32 или двойной. Если вы хотите, чтобы конечное изображение было uint8, требуется явное преобразование.

1 голос
/ 20 января 2013
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 голос
/ 08 января 2013
% 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 в другом и так далее. .. надеюсь, это поможет

0 голосов
/ 12 января 2015
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
0 голосов
/ 17 апреля 2011
% 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,[]);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...