Ускорение сохранения рисунков в виде растрового изображения в MATLAB - PullRequest
0 голосов
/ 21 июля 2009

У меня есть образы bmp в папке изображений на моем компьютере. Я назвал его от 1.bmp до 100.bmp. Размер всех них составляет 576 * 768

Я читаю по очереди эти скученные изображения. Я выбираю прямоугольную область из всех ста изображений. Пиксельные координаты прямоугольной области изменяются с 182 до 281 по вертикали и с 426 по 639 по горизонтали. все пиксельные координаты в прямоугольной области в другой файл

Мой файл м ниже:

pixvalue=zeros(100);
j=1 ;% will represent pixel coordinate sequence 
%  find pizel coordinates in rectangular region 
 for y=182:281
       for x=426:639
           for i=1:100
          % read images
        s = sprintf('C:\\images\\%d.bmp', i);  
        A = imread(s);
        A=double(A);
        pixvalue(i)= A(y,x);
        end
       s2=sprintf('%d.plot', j);
      f=figure('visible','off'),
      plot(pixvalue);
      xlabel('images');
      ylabel('pixvalue');
      title(s2);
      s3=sprintf('C:\\registration\\%d.bmp', j);

      %% save figures as 8 bit bitmap to file
      print(f,'-dbmp256',s3);
      j=j+1;
       end
   end

К сожалению, этот код работает очень медленно !! Как я могу ускорить это?

С наилучшими пожеланиями ...

Ответы [ 3 ]

1 голос
/ 21 июля 2009

Ваш код можно разбить на две части. Сначала вы хотите загрузить данные изображения и сохранить значения пикселей в субрегионе каждого изображения. Это можно сделать с помощью следующего кода:

subRegion = zeros(100,214,100);  % 3-D matrix to store image subregions
for i = 1:100,
  s = ['C:\images\' int2str(i) '.bmp'];      % Create file name string
  A = double(imread(s));  % Load image and convert to double precision
  subRegion(:,:,i) = A(182:281,426:639);    % Store subregion of image
end

Затем кажется, что вы хотите построить значения для каждого пикселя для всех изображений и вывести график в файл. Это много файлов изображений (21 400!), И для запуска потребуется некоторое время. Если вы уверены, что хотите это сделать, вот один из способов:

j = 1;  % Pixel index
for y = 1:100,  % Loop over rows
  for x = 1:214,  % Loop over columns
    hFigure = figure('Visible','off');
    data = subRegion(y,x,:);  % Get pixel value from all 100 images
    plot(data(:));
    xlabel('images');
    ylabel('pixvalue');
    title(['Plot ' int2str(j)]);
    outFile = ['C:\registration\' int2str(j) '.bmp'];
    print(hFigure,'-dbmp256',outFile);  % Save figure
    j = j+1;
  end
end
1 голос
/ 21 июля 2009

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

http://blogs.mathworks.com/videos/2008/02/26/matlab-basics-getting-a-directory-listing/

1 голос
/ 21 июля 2009

вы читаете одно и то же изображение в (281-182) * (639-426) раза ..

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

чем вы должны сделать то, что вы должны сделать ..

что-то вроде:

for i=1:100
    % read images
    s = sprintf('C:\\images\\%d.bmp', i);  
    A(i) = imread(s);
end

for x=...
    for y=...
        for i=1:100
            pixvalue(i)= A(i, y, x);
        end
    end

        ..
        ..

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

чем в большом цикле вы используете A (i) вместо A.

пс. кстати, я оптимизировал его, как будто предыдущий код работает .. У меня нет Matlab сейчас, чтобы попробовать ..

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...