直方图均衡化的实现

直方图均衡化的实现

       直方图均衡是数字图像的一个基础算法,原理在这里我就不再多说的,如果还没弄懂直方图均衡原理的朋友,建议先去看懂原理,这里是传送门
       下面,先来看看用Matlab中的histeq方法处理的代码:

clc
clear
img = imread('river.jpg');  %读取图像
figure(1);                  %画出原图及其直方图
subplot(3, 2, 1);
imshow(img);
title('原图');
subplot(3, 2, [3 4]);
imhist(img);
title('原图的直方图');
[J,T] = histeq(img, 256);   %直方图均衡化
subplot(3, 2, 2);           %画出均衡化后的图及直方图
imshow(J);
title('均衡化的图');
subplot(3,2, [5 6]);
imhist(J);
title('均衡化后的直方图');

       然后,我们再来试试不直接调用histeq方法,根据直方图的数学原理,直接计算出均衡化之后的图像。具体实现如下:

clc;
clear;
img = imread('river.jpg');  %读取图片
[M,N] = size(img);          %获取行列数据
[count, x] = imhist(img);   %获取每个灰度级的像素数目及累积概率密度
a = 255.0/(M*N);            %计算L/A0
s = zeros(1, 256);          %初始化目的图像中每个灰度级上的累积像素数目
%计算目的图像中每个灰度级上的累积像素数目
for i = 1:256
    for j = 1:i
        s(i) = count(j) + s(i);
    end
end
s = round(a*s + 0.5);       %乘上L/A0,并通过四舍五入s中的数据整数化
result_img = img;           %初始化目的图像
for i = 1:256               %均衡化图像,将对应像素值进行映射
    index = find(img == i - 1);
    result_img(index) = s(i);
end
%画图
figure;
imshow(result_img);
title('均衡后的图');
figure;
subplot(3, 2, 1);
imshow(img);
title('原图');
subplot(3, 2, [3 4]);
imhist(img);
title('原图的直方图');
subplot(3,2,2);
imshow(result_img);
title('均衡后的图');
subplot(3,2,[5 6]);
imhist(result_img);
title('均衡后直方图');

实际上,就是实现下面的公式:
在这里插入图片描述
其中, f(DA)表示目标图像像素的灰度值, L 代表灰度级, A0为总的像素个数, HA( u) 为原图在 u 灰度级上的像素数目。

实现效果

用下面这幅图作为测试:
在这里插入图片描述
均衡化效果:
在这里插入图片描述
直方图对比:
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/ShenDW818/article/details/83450968
今日推荐