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.

简单说,就是实现一个直方图均衡化的程序。

直方图均衡化的好处多多,直观讲,就是可以让图像颜色变化更加均匀,使得太暗的部分显示出更多的细节。

下面介绍算法的主要思路。

主要参考了维基百科的文章。

算法步骤

  1. 获取原始图像信息,并转化为灰度图像,获得图像信息矩阵;

  2. 统计不同灰度的频数分布P(gray_value) ni n i 为该灰度值的像素点的数量;

    Px(i)=p(x=i)=ni P x ( i ) = p ( x = i ) = n i

  3. 计算得到灰度的概率分布累积函数cdf,即cumulative distribution function;

    cdf_x(i)=_j=0ip_x(j) c d f _ x ( i ) = ∑ _ j = 0 i p _ x ( j )

  4. 对累积分布函数进行均衡化:

    P_y(i)=T[cdf_x(i))] P _ y ( i ) = T [ c d f _ x ( i ) ) ]

其中 T(x) T ( x ) 是关于 x x 的一个转化函数,在这里我们定义 T T

P_x(i)=round[cdf(v)cdf_minMNcdf_min×(Graylevel2)]+1 P _ x ( i ) = r o u n d [ c d f ( v ) − c d f _ m i n M ∗ N − c d f _ m i n × ( G r a y l e v e l − 2 ) ] + 1

  1. 接下来我们可以利用新的 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:height
    for j = 1:width
        gray_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_level
    cdf(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_level
    cdf_equal(i) = round( (cdf(i)-cdf_min) / (height * width - cdf_min) * (gray_level - 1) ) + 1;
end
  • 计算图像像素点新的灰度值
pic_equal = pic_ori;
for i = 1:height
    for j = 1:width
        pic_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)%显示原始图像直方图   

结果展示

原始图像如图

可以比较明显地看到,两幅图像的灰度变化更为均匀。

你可能感兴趣的:(Data,Mining)