1

画像の累積分布関数を計算する必要があります。次のコードを使用して値を正規化しました。

im = imread('cameraman.tif');
im_hist = imhist(im);
tf = cumsum(im_hist); %transformation function
tf_norm = tf / max(tf);
plot(tf_norm), axis tight

また、CDF関数がプロットされるとき、プロットは、ピクセル強度の等しい表現を表すために理想的には直線でなければならない直線である必要がありますか?

4

2 に答える 2

3

CDF は次の方法で簡単に取得できます。

A = imread('cameraman.tif');    
[histIM, bins] = imhist(A);
cdf = cumsum(counts) / sum(counts);
plot(cdf); % If you want to be more precise on the X axis plot it against bins

有名な場合、次のcameraman.tifようになります。

ここに画像の説明を入力

2番目の質問について。ヒストグラムが完全に均等化されている場合 (つまり、各強度がほぼ同じピクセル数に対応している場合)、CDF は 45° の直線のように見えます。

編集:CDFは確率を記述するため、厳密に言えば cumsum 、単独では適切なCDFではありません。したがって、確率公理に従わなければなりません。特に、確率の最初の公理は、確率値が範囲内にある必要があり[0 ... 1] cumsum単独ではそれを保証しないことを示しています。

于 2014-08-09T05:53:49.827 に答える
0
function icdf = imgcdf(img)
% Author: Javier Montoya (jmontoyaz@gmail.com).
%         http://www.lis.ic.unicamp.br/~jmontoya
%
% IMGCDF calculates the Cumulative Distribution Function of image I.
% Input parameters:
%    img: image I (passed as a bidimensional matrix).
% Ouput parameters:
%    icdf: cumulative distribution function.
%
% See also: IMGHIST
%
% Usage:
%    I    = imread('tire.tif');
%    icdf = imgcdf(I);
%    figure; stem(icdf); title('Cumulative Distribution Function (CDF)');

   if exist('img', 'var') == 0
      error('Error: Specify an input image.');
   end

   icdf    = [];
   ihist   = imghist(img);
   maxgval = 255;
   icdf    = zeros(1,maxgval);

   icdf(1)= ihist(1);
   for i=2:1:maxgval+1
      icdf(i) = ihist(i) + icdf(i-1);
   end
end

それは私のコードではありませんが、私にとってはうまくいきます! 統計ツールボックスの cdf 関数も確認してください。

于 2014-08-09T05:45:49.930 に答える