图像增强之直方图均衡化[MATLAB实现]

此处为方便理解,不使用MATLAB中自带的histeq,手写代码了解内在原理。

原始彩色图片如下:
图像增强之直方图均衡化[MATLAB实现]_第1张图片
均衡化后的图像如下:

图像增强之直方图均衡化[MATLAB实现]_第2张图片
图像增强之直方图均衡化[MATLAB实现]_第3张图片
从累计分布函数的图像可以明显看出,均衡化只需要用一次即可,第二次几乎没有作用,因为均衡化的累计分布函数已经是一条斜率为1的函数,表明其函数已经服从均匀分布~!
完整MATLAB代码如下:

clc
clear

%% 1.图片预处理
L = 256;                    % 划分的灰度级,一般也默认为256
img = imread('西西弗.jpg');  % 读图
img_gray = img(:,:,1);             %3通道彩色图片转换为1通道灰度图像

%% 2.计算每个灰度级的概率分布P(离散值)和累计分布S
N = imhist(img_gray);         % 直方图函数默认划分256个灰度级
for i = 1:size(N)
   P(i) = N(i)/sum(N);
   if i == 1
      S(1) = P(1); 
   else
      S(i) = S(i-1) + P(i);
   end
end

%% 3.将累计分布S映射回R,得到均衡化后的R
r = round((L-1).*S+0.5); 

%% 4.根据均衡化后的R,生成均衡化后的灰度图像
img_equal = img_gray;
for i = 1:size(img_equal(:))
    value = img_equal(i);
    if value == 0            % 灰度值value∈[0,255],但matlab中索引从1开始
        img_equal(i) = 1;
    else
        img_equal(i) = r(value);
    end
end

%% 5.绘图
figure('NumberTitle', 'on', 'Name', '原始彩色图片'),imshow(img)
figure('NumberTitle', 'on', 'Name', '原始灰度图片'),imshow(img_gray)
figure('NumberTitle', 'on', 'Name', '均衡化后的灰度图片'),imshow(img_equal)

figure
subplot(2,1,1);imhist(img_gray,L),title('1.原始灰度图直方图');   % 划分为L个灰度级
subplot(2,1,2);imhist(img_equal,L),title('2.均衡化后的灰度图片直方图');   % 划分为L个灰度级

figure('NumberTitle', 'on', 'Name', '累积分布函数'),plot(1:256,S)
axis([0 256 0 1]) % X象限∈[0,255],Y[0,1]

【参考文献】:
[1] 直方图均衡化计算过程.
[2] 直方图均衡(不用histeq)与直方图规定化.
[3] 直方图均衡化过程(例题).
[4] 直方图规定化计算过程.

你可能感兴趣的:(Matlab,均衡化,图像处理,matlab,图像增强,直方图)