步骤:
1.求原图像的灰度分布直方图
2.根据灰度变换函数构建映射表
3.根据映射表生成均衡图像
Matlab代码:
clc,clear;
f = imread('river.jpg');
[h,w] = size(f);
% 求图像f的灰度分布直方图
hist1 = zeros(1,256); % hist1为灰度分布向量,0无法作为索引,索引1对应灰度值0
for row = 1:h
for col = 1:w
hist1(f(row,col)+1) = hist1(f(row,col)+1) + 1;
end
end
% 求直方图均衡的变换函数
map_table = zeros(1,256); % map_table为映射表,map_table[i+1]代表原来的灰度值i经过变换后的灰度值
cum_sum = 0;
for index = 1:256
cum_sum = cum_sum + hist1(index);
map_table(index) = (255/(h*w))*cum_sum;
end
% 根据直方图均衡变换函数求均衡后的图像f1
f1 = zeros(h,w); % 先初始化f1
for row = 1:h
for col = 1:w
f1(row,col) = map_table(double(f(row,col)+1)); % 先进行类型转换,防止溢出
end
end
% 上述循环等效于f1 = map_table(double(f)+1);
f1 = uint8(f1);
f2 = histeq(f); % 调用histeq()函数
% 显示原图像,均衡后的图像,调用库函数均衡后的图像
figure;
subplot(131),imshow(f),title('原图像');
subplot(132),imshow(f1),title('直方图均衡后的图像');
subplot(133),imshow(f2),title('调用库函数均衡后的图像');
% 显示原图像,均衡后的图像,调用库函数均衡后的图像的直方图
figure;
subplot(131),imhist(f),title('原直方图');
subplot(132),imhist(f1),title('均衡后的直方图');
subplot(133),imhist(f2),title('调用库函数均衡后的直方图');
测试图像:
运行结果: