图像增强算法:直方图均衡算法以及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的图像处理教程》。
内容仅供学习使用,请勿转载。
如有问题,欢迎指正。
魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。
更多推荐


所有评论(0)