文档库 最新最全的文档下载
当前位置:文档库 › Matlab图像处理——直方图均衡化

Matlab图像处理——直方图均衡化

Matlab图像处理-直方图均衡化原理方法?

?|

?浏览:1578

?|

?更新:2014-05-30 11:47

?|

?标签:matlab

?

1

?

?

2

?

?

3

?

?

4

?

?

5

?

分步阅读

本教程适合Matlab数字图像处理的初学者。直方图均衡化是数字图像处理中较为基础的图像增强方法,通过直方图均衡化能够自适应地有效改善图像对比度不足问题。本文中所支持的直方图均衡化图像,不仅仅限于灰度图,更将RGB 真彩色图、多波段遥感影像纳入直方图均衡化范畴。较为全面直观地给出在

Matlab中对图像进行直方图均衡化的方法原理和Matlab源代码,并配合必要的代码注释,希望能帮助Matlab和数字图像处理的初学者入门。

工具/原料

?

推荐:Matlab 2013a及以上

?

?

支持:灰度图、RGB真彩色图、多波段遥感影像

?

方法/步骤

.

1

.

打开图像

.

[FileName, FilePath]=uigetfile('*.tif;*.jpg;*.png;*.img;*.gif;','请选择图像数据');

.

str=[FilePath FileName];

.

Image=imread(str);

.

% 以对话框的形式选择打开一幅图像

.

[M,N,nDims]=size(Image);

.

Image=im2double(Image);

% 获取图像的尺寸和波段数

.

.

2

.

直方图均衡化

.

HISTEQ=Image;

.

for i=1:nDims % 分别对各波段进行直方图均衡化

.

H=Image(:,:,i);

.

[counts,x]=imhist(H); % 计算各灰度级x的像素个数count

.

loction=find(counts~=0); % 找到所有像素个数不为0的灰度级

MinCDF=min(counts(loction));

.

for j=1:length(loction)

.

CDF=sum(counts(loction(1:j))); % 计算各灰度级像素个数累积分布CDF

.

P=find(H==x(loction(j)));

.

H(P)=(CDF-MinCDF)/(M*N-MinCDF); % 灰度转换公式

.

end

.

HISTEQ(:,:,i)=H; % 将均衡化后各分量分别保存在结果中

.

end

.

.

3

.

保存输出

.

figure, % 在同一窗口显示原图与灰度拉伸结果图

.

if nDims==3||nDims==1 % 若为灰度图和RGB真彩色图则以常规方式保存并输出

.

subplot(1,2,1),imshow(Image);title('原图');

.

subplot(1,2,2),imshow(HISTEQ);title('直方图均衡化');

.

imwrite(HISTEQ,'Result_HISTEQ.jpg','jpeg');

.

else % 若为多波段遥感影像则按照TM 3,2,1组合形式保存并输出.

subplot(1,2,1),imshow(Image(:,:,[3,2,1]));title('原图');

.

subplot(1,2,2),imshow(HISTEQ(:,:,[3,2,1]));title('直方图均衡化'); .

imwrite(HISTEQ(:,:,[3,2,1]),'Result_HISTEQ.tif','tiff');

.

end

.

% 将直方图均衡化结果保存至当前目录并以Result_HISTEQ命名

.

END

.

结果对比

.

.

上图:原灰度图

.

下图: 直方图均衡化结果图.

.

.

END

.

直方图对比

.

.

上图:原灰度图直方图

.

下图: 直方图均衡化结果图直方图.

.

.

END

.

注意事项

本例中将RGB真彩色图各个分量进行均衡化后,图像中会有异常点,可将RGB 映射到YUV空间,对亮度单独进行均衡化即可。

?

?

Matlab中结合imhist和histeq函数对灰度图直接进行直方图均衡化,本例为详细说明方法原理,而通过自编写代码实现。

?

?

如需进一步了解详细原理,可参考维基百科词条直方图均衡化。

?

相关文档
相关文档 最新文档