CV

图片直方图均衡化实验报告

Posted by 彳亍而行 on November 15, 2017

一、 实验目的

实现灰度图片直方图均衡化,并与软件函数库自带的均衡化函数进行对比,以达到熟悉均衡化技术,并了解均衡化效果的目的。

二、 实验原理

照片经常会由于曝光不足或过度,导致其颜色整体偏暗或偏亮,有时难以辨别其细节与整体轮廓,体现在直方图上,就是直方图整体偏向接近0的一边(曝光不足),或接近255的一边(曝光过度)。这时候,对直方图进行均衡化,可以达到2个效果:

  1. 将图片整体色调由过暗/过亮调整为较为平均地分布在各个亮度区域中。

  2. 由于图片的信息平均地分布,导致图片不同灰度之间的距离增大,增加了对比度,增加了人眼的辨识度,对其轮廓、细节有更好的体现。

直方图均衡化的数学原理:

利用累积分布函数,得到之前灰度与之后灰度的对应关系,由此进行均衡化。累积分布函数的公式是:

img

三、 实验环境

Matlab 2014a,MacOS操作系统。

四、 实验步骤

  1. 加载图片
clc;
clear;
close all;
warning off;

image_name= 'dark1'
dark1 = imread([image_name,'.jpg']);
  1. 将彩色图片转化为灰度图(此步骤使用了Matlab中自带的函数)
%转换成灰度图
height= size(dark1, 1);
width  = size(dark1, 2);
dark1_gray = rgb2gray(dark1);
  1. 统计灰度图里的各数值出现的概率
function[ histogram_list ] = histogram( image )

histogram_list= zeros(1, 256);
fori=1:256
    count = sum(image(:)==i-1);
    histogram_list(i) = count;
end

end
  1. 计算累积分布
%计算累积分布
cdf_list= zeros(1,256);
fori=1:256
    if i==1
        cdf_list(i) = histogram_list(i);
    else
        cdf_list(i) = cdf_list(i-1) +histogram_list(i);
    end
end 

%归一化+扩展到255
total_count= width * height * 1.0;
cdf_list= cdf_list/total_count;
cdf_list= uint8(cdf_list * 255.0 + 0.5);
  1. 将累积分布的结果应用到原图片中
%应用到图片中
fori=1:width
    for j=1:height
        old_value = dark1_gray(j,i);
        new_value = cdf_list(old_value + 1);
        dark1_gray(j,i) = new_value;
    end
end
  1. 画出原图和均衡化后图片的直方图

imhist(dark_gray)

  1. 使用Matlab自带的均衡化函数,进行对比

dark1_gray = histeq(dark1_gray);

五、 实验结果

实验对3张曝光不足、1张曝光过度的图片进行了测试,得到的结果如下图。每一张图中,左上角为原始图,右上角为原始图的灰度直方图,左下角为均衡化后的图,右下角为均衡化后的灰度直方图。

图1(曝光不足)

dark1

图2(曝光不足)

dark2

图3(曝光不足)

dark3.jpg

图4(曝光过度)

bright1

同时,我也对Matlab软件自带的函数进行了测试,并与我自己实现的方法的结果进行了对比。使用的函数是histeq()函数。对比结果如下图所示。其中,左上角为用我自己实现的方法提到的结果,右上角为其灰度直方图,左下角是用histeq()函数得到了结果,右下角为其灰度直方图。

图5(曝光过度)

compare1

图6(曝光不足)

compare2

六、 讨论分析

由上面几张图的结果可以看出,做过均衡化后的图,其暗部区域的对比度明显增加,比如图1中的人脸、图2中的狗身,尤其是图3,原始图中几乎看不清,但经过均衡化后,明显能看到是一块木板斜靠在墙边。而在图4中,较亮的天空、白墙的细节增加,较暗的树林细节也有一定增加。

同时,此方法也带来了一定的噪点,比如图3,能看到明显的噪点。

对于我自己实现的均衡化方法,和Matlab自带的均衡化函数,经过仔细对比,发现2种方法得到的结果,其视觉效果差异非常小,几乎可以忽略不计。然而比较其各自的灰度直方图,还是能够看到较大的差别。

Matlab自带函数用的是什么方法,为什么直方图不一致,而视觉效果却差不多,这是以后可以探究的内容。