Дохист на двойной матлаб - PullRequest
       10

Дохист на двойной матлаб

0 голосов
/ 01 ноября 2011

как мне преобразовать изображение, представленное как двойное, в изображение, которое я могу использовать для создания гистограммы?

(с dohist:)

% computes the histogram of a given image into num bins.
% values less than 0 go into bin 1, values bigger than 255
% go into bin 255
% if show=0, then do not show. Otherwise show in figure(show)


function thehist = dohist(theimage,show)

  % set up bin edges for histogram

  edges = zeros(256,1);
  for i = 1 : 256;
    edges(i) = i-1;
  end

  [R,C] = size(theimage);
  imagevec = reshape(theimage,1,R*C);      % turn image into long array
  thehist = histc(imagevec,edges)';        % do histogram

  if show > 0
      figure(show)
      clf
      pause(0.1)
      plot(thehist)
      axis([0, 256, 0, 1.1*max(thehist)])
  end

Ответы [ 3 ]

1 голос
/ 01 ноября 2011

Я предполагаю, что вам сначала нужно нормализовать изображение, для этого вы можете использовать:

255*(theimage./(max(theimage(:)));
0 голосов
/ 02 ноября 2011

Встроенная функция hist может применяться непосредственно к изображениям класса double.

Ссылка на документацию Matlab

Если у вас есть изображение с разрешением N битов на интервале [A, B], вы можете позвонить histнепосредственно на изображении (без преобразования), например:

[H,bins] = hist(IM,linspace(A,B,2^N));

для получения гистограммы и бинов или

hist(IM,linspace(A,B,2^N));

для простого построения гистограммы.

0 голосов
/ 01 ноября 2011

Ваш код выглядит нормально, вы можете убедиться, что границы корректно обрабатываются с помощью:

theimage(theimage<0) = 0;
theimage(theimage>255) = 255;

Но это не обязательно, обычно вы либо получаете двойное изображение в диапазоне [0,1], либо uint8 [0,255], когда читаете изображение с imread(). При необходимости просто измените масштаб на [0,255].

Некоторые другие советы:

Вы можете сделать вектор-ребро следующим образом:

edges = 0:255;

И theimage(:) - это то же самое, что и reshape(theimage,1,R*C) в этом случае, так как вам нужен один длинный вектор.

...