本文主要是介绍Histogram Equalization in Matlab,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
title: Histogram Equalization in Matlab
date: 2014-10-04 11:06:15
categories: Digital Image Processing
tags:
- Digital Image Processing
- Computer Vision
- Algorithm
算法需求
要求如下:
Histogram Equalization (test images: fig1.jpg, fig2.jpg)
a. Write a computer program for computing the histogram of an image.
b. Implement the histogram equalization technique.
c. Your program must be general to allow any gray-level image as its input.
简单说,就是实现一个直方图均衡化的程序。
直方图均衡化的好处多多,直观讲,就是可以让图像颜色变化更加均匀,使得太暗的部分显示出更多的细节。
下面介绍算法的主要思路。
主要参考了维基百科的文章。
算法步骤
获取原始图像信息,并转化为灰度图像,获得图像信息矩阵;
统计不同灰度的频数分布
P(gray_value)
, ni n i 为该灰度值的像素点的数量;
Px(i)=p(x=i)=ni P x ( i ) = p ( x = i ) = n i计算得到灰度的概率分布累积函数
cdf
,即cumulative distribution function
;
cdf_x(i)=∑_j=0ip_x(j) c d f _ x ( i ) = ∑ _ j = 0 i p _ x ( j )对累积分布函数进行均衡化:
P_y(i)=T[cdf_x(i))] P _ y ( i ) = T [ c d f _ x ( i ) ) ]
其中 T(x) T ( x ) 是关于 x x 的一个转化函数,在这里我们定义 为
- 接下来我们可以利用新的 cdf c d f 值对原始图像进行均一化:
Image(i,j)=cdf_y(k) I m a g e ( i , j ) = c d f _ y ( k )
代码及解析
- 读取图像,检测是否为灰度图像,否则转化为灰度图,并获得图像信息矩阵
pic_ori
clear all
pic_ori = imread('./images/Fig1.jpg');
size = size(pic_ori);
if( numel(size) > 2 ) % Function ISRGB has been removed.pic_ori = rgb2gray(pic_ori);size = size(pic_ori);
end
height = size(1);
width = size(2);
gray_level = 256; % the number of grey levels used
- 显示未处理图像
figure,imshow(pic_ori) % Image before processing
title('未处理图像') % * 获取灰度值频数分布
P = zeros(gray_level,1);
for i = 1:heightfor j = 1:widthgray_value = pic_ori(i,j)+1; % P(0); index must be a positive % integer or logical.P(gray_value) = P(gray_value) + 1;end
end
- 获得灰度值累积分布
cdf = zeros(gray_level,1);
cdf(1) = P(1);
cdf_min = 0;
for i = 2:gray_levelcdf(i) = cdf(i-1) + P(i);if(cdf_min == 0 && cdf(i) > 0)cdf_min = cdf(i);end
end
- 对灰度值累积分布进行转化
cdf_equal = zeros(gray_level, 1);
for i = 1:gray_levelcdf_equal(i) = round( (cdf(i)-cdf_min) / (height * width - cdf_min) * (gray_level - 1) ) + 1;
end
- 计算图像像素点新的灰度值
pic_equal = pic_ori;
for i = 1:heightfor j = 1:widthpic_equal(i,j) = cdf_equal( pic_equal(i,j) + 1 );end
end
- 显示均衡化后的图像
figure,imshow(pic_equal) % Image after equalization
title('均衡化后图像')
- 显示直方图的函数是
figure
subplot(221)
imshow(pic_ori)%显示原始图像
subplot(222)
imhist(pic_ori)%显示原始图像直方图
结果展示
原始图像如图
可以比较明显地看到,两幅图像的灰度变化更为均匀。
这篇关于Histogram Equalization in Matlab的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!