直方图规定化的原理,
直方图规定化是指将一幅图象通过灰度变换后,使其具有特定的直方图形式。直方图规定化处理一般可以分为两类:①使图象与某一标准图象具有相同的直方图;②图象具有某一特定函数(比如说高斯函数)形式的直方图。
如下图所示,希望将图象A(x,y)变换为具有特定直方图H3(D)的图象C(x,y)。首先利用直方图均衡化将图象A(x,y)变换为具有平坦直方图的图象B(x,y),再利用第二个灰度变换将B(x,y)变换为C(x,y):
直方图规定化处理的第二种方法,代码举例如下:
% AdvancedGaussian.m
% 定义一个高斯函数。
r = 127;
x = -r : r + 1;
sigma = 20;
y = exp(-(x.^2) / (2 * sigma ^ 2));
%im=imread('bg.bmp'); %匹配一个图像的直方图
%y=imhist(im);
y = y / sum(y); %归一化,使函数符合概率分布的sum(y)==1这样一个规律
plot(y); %待匹配的直方图
%函数的累积直方图
Q = [];
for i = 1 : 256
if (i == 1)
Q(i) = y(i);
else
Q(i) = Q(i - 1) + y(i);
end
end
img = imread('F:/personal/2_硕士/1_2_研一下学期/3_图像处理技术(李智)/2017.03.21/0_Equalization/lena512.bmp');
figure;imshow(img)
[m n] = size(img);
hist = imhist(img); %待处理图像的直方图
p = hist / (m * n);
figure;plot(p) %原图直方图
%待处理图像的累积直方图
P = [];
for i = 1:256
% P = [P sum(p(1 : i))];
if (i == 1)
P(i)=p(i);
else
P(i) = P(i - 1) + p(i);
end
end
for i = 1 : 256
tmp{i} = Q - P(i);
% 因为要找距离最近的点,所以取绝对值
tmp{i} = abs(tmp{i});
% 找到两个累积直方图距离最近的点
[a index(i)] = min(tmp{i});
end
imgn = zeros(m, n);
for i = 1 : m
for j = 1 : n
%由原图的灰度通过索引映射到新的灰度
imgn(i, j) = index(img(i, j) + 1) - 1;
end
end
imgn=uint8(imgn);
figure;imshow(imgn)
figure;plot(imhist(imgn)) %新图的直方图
© 著作权归作者所有