直方图均衡化的实现

本文介绍了直方图均衡化的概念,并提供了使用Matlab中histeq函数及手动实现该算法的代码示例,展示了直方图均衡化后的图像效果和原图直方图对比。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

直方图均衡化的实现

       直方图均衡是数字图像的一个基础算法,原理在这里我就不再多说的,如果还没弄懂直方图均衡原理的朋友,建议先去看懂原理,这里是传送门
       下面,先来看看用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 灰度级上的像素数目。

实现效果

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值