目录

一.直方图均衡算法

二.直方图均衡的MATLAB实现


一.直方图均衡算法

直方图均衡算法是一种图像增强算法。我们常见的图像增强算法有:对比度增强,直方图均衡,降噪滤波,锐度饱和度算法。

直方图均衡也叫直方图拉伸,通过改变图像的直方图分布,来改变图像中各像素的灰度。原始的图像可能由于其灰度分布比较集中,导致曝光不足/过高,通过直方均衡后,可以把原始的直方图变为亮暗均匀分布,提升对比度,改变曝光不足/过高的情况。

假设n(k)为原图灰度级为k的像素个数,也就是对应灰度直方图中的纵坐标高度,计算此灰度出现的概率P(k),即

其中,N为图像的像素点总数。

然后再计算原始图像灰度累计分布概率s(k),即

由于整体的概率分布=1,将数值扩大到255倍后,将概率拉伸到0~255,最终得到直方均衡后的概率,即

二.直方图均衡的MATLAB实现

clc;
clear all;

img = imread('D:\matlab file\histogram_equalization\yu1.bmp');  %获取图像数据
img = rgb2gray(img);

h = size(img,1);   %获取图像宽高
w = size(img,2);

figure('Position', [700,200, 1000, 800]);  %设置figure的大小
subplot(2,3,1);imshow(img);title('原图');
subplot(2,3,4);imhist(img);title('原图的灰度直方图');

%系统函数实现直方图均衡
img_histogram = zeros(h,w);
img_histogram = histeq(img);   %系统函数实现直方图均衡

subplot(2,3,2);imshow(img_histogram);title('system histeq image');
subplot(2,3,5);imhist(img_histogram);title('system histeq hist');

%手动计算实现直方图均衡
numpixel = zeros(1,256);
for i = 1 : h
    for j = 1 : w
            numpixel(img(i,j) + 1) = numpixel(img(i,j) + 1) + 1;  %统计对应灰度的个数  并将0-255映射到1-256
    end
end
%累加截至至当前灰度的累计分布概率
sumpixel = zeros(1,256);
for i = 1 : 256
    if i == 1
        sumpixel(i) = numpixel(i);
    else
        sumpixel(i) = numpixel(i) + sumpixel(i - 1);
    end
end
%将其扩大255倍,实现直方均衡
img_histogram1 = zeros(h,w);
for i = 1 : h
    for j = 1 : w
        img_histogram1(i,j) = sumpixel(img(i,j) + 1) / (h * w / 255);  
    end
end
img_histogram1 = uint8(img_histogram1);

subplot(2,3,3);imshow(img_histogram1);title('manual histeq image');
subplot(2,3,6);imhist(img_histogram1);title('manual histeq hist');

上述代码使用了两种方法实现直方图均衡,一种是系统函数实现,一种是手动写算法实现,最后的结果显示如下:

参考自《基于MATLAB与FPGA的图像处理教程》。

内容仅供学习使用,请勿转载。

如有问题,欢迎指正。

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐