数字图像处理——直方图均衡

步骤:

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('调用库函数均衡后的直方图');

测试图像:

运行结果:

猜你喜欢

转载自blog.csdn.net/Lee_01/article/details/81054434