我需要计算图像的累积分布函数。我使用以下代码对值进行了规范化:
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函数时,绘图是否必须有点直线,理想情况下应该是一条直线来表示像素强度的相等表示?
答案 0 :(得分: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
,它会产生:
至于你的第二个问题。当直方图完全均衡时(即,当每个强度对应大致相同数量的像素时),您的CDF将看起来像直线45°线。
编辑:严格地说 cumsum
单独不是正确的CDF,因为CDF描述概率,因此它必须服从概率公理。特别是第一个概率公理告诉我们概率值应该在[0 ... 1]
范围内而cumsum
并不能保证这一点。
答案 1 :(得分: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函数