MATLAB图像直方图均衡化
(1)图像直方图均衡化
图像直方图是对图像灰度出现频数的统计(这里只研究灰度图,暂不讨论多通道图像)。一张高对比度的图,往往各个灰度级出现频次相近,因此在图像增强时时常希望将使直方图均衡。
(2)MATLAB函数实现
MATLAB本身自带直方图均衡化函数:histeq(),最简单的调用就是以想处理的图像作为输入变量即可。同时MATLAB还提供了一个函数:adapthisteq(),可以进行自适应的直方图均衡化。这两者对同一张图像处理的区别见下图:
原图直方图
处理效果图
处理后直方图
可以看出,自适应全局直方图均衡化效果会更好一些。
(3)自编程序实现
通过以下自编程序实现了直方图均衡化(具体算法略):
%读入待处理图片
original = imread('F:\Fig0327(a)(tungsten_original)','tif');
%获取待处理图片尺寸
[h w] = size(original);
%直方图统计
p = zeros(1,256);
for i = 1:256
p(i) = sum(sum(original == (i-1)));
end
p = double(p);
p = p./(h*w);
figure(1);
bar(0:255,p);hold on;%这里直接bar(p)会导致横坐标与灰度值差1
axis([0 255 0 0.12]);
title('我的直方图分布');
% 直方图均衡化
s = zeros(1,256);
for i = 1:256
for j = 1:i
s(i) = s(i)+255*p(j);
end
end
s = uint8(s);
for i = 1:h
for j = 1:w
for k = 1:256
if original(i,j) == k-1
original(i,j) = s(k);
break;%防止重复赋值
end
end
end
end
figure(2);
subplot(1,3,1)
imshow(original);hold on;
title('原图像');
这串代码未经优化,占用了大量资源、耗费了大量时间,有待改进。但是真正的问题是它的处理效果和MATLAB自带函数不同,结果如下:
处理效果图
统计直方图
出现原因有待考证。(有点忙)
(4)资料来源
冈萨雷斯的《数字图像处理》啦~