直方图均衡化原理及matlab实现代码

一、基本原理

对于一幅n位的灰度图像,灰度级的最大变化范围为[0, 2 n 2^n 2n-1]。如果在这幅图像中,每一灰度级都出现,并且每一灰度级出现的概率相等,那么这幅图像会有较高的对比度和丰富多变的灰度色调。直方图均衡化的基本思想是对原始图像的灰度级进行某种映射,使目标图像灰度级的动态范围相对原始图像得到提高,并使目标图像的概率密度呈现均匀的分布。

二、实现步骤

(1)统计每一灰度级对应的像素数目
在这里插入图片描述
上式中,n是图像的位数,k是灰度级, n k n_k nk是灰度级为k的像素的数目;
(2)计算每一灰度级出现的概率
在这里插入图片描述
上式中,M是图像的行数,N是图像的列数,MN是图像中像素的总数,P(k)是灰度级k出现的概率;
(3)计算用于直方图均衡化的变换函数,对 s k s_k sk进行四舍五入
在这里插入图片描述
(4)将原始图像中灰度级为k的所有像素点的灰度级改变为 s k s_k sk,即可得到直方图均衡化以后的图像。

三、效果演示

(1)原图像和均衡化图像;
直方图均衡化原理及matlab实现代码_第1张图片 直方图均衡化原理及matlab实现代码_第2张图片
(2)原图像和均衡化图像的归一化直方图;
直方图均衡化原理及matlab实现代码_第3张图片 直方图均衡化原理及matlab实现代码_第4张图片

(3)原图像和均衡化图像的累积归一化直方图;
直方图均衡化原理及matlab实现代码_第5张图片 直方图均衡化原理及matlab实现代码_第6张图片
(4)直方图均衡的变换函数。
直方图均衡化原理及matlab实现代码_第7张图片

四、matlab代码

%% 直方图均衡化
clear,close all
srcImg = imread('直方图均衡化用.tif');
h = figure(1);
size = get(0,'ScreenSize');
set(h,'position',size)
subplot(231);
imshow(srcImg);
title('原图像','fontsize',18);
p = histogram(srcImg);% 计算原图像的归一化直方图
subplot(232);
bar(0:255,p);
axis([0,255,0,max(p)*1.2]);
title('原图像的归一化直方图','fontsize',18);
s = cum(p);% 计算原图像的累积归一化直方图
subplot(233);
bar(0:255,s);
axis([0,255,0,max(s)*1.2]);
title('原图像的累积归一化直方图','fontsize',18);
s = uint8(s*255);% 四舍五入
dstImg = transform(srcImg,s);% 对原图像进行灰度级映射,得到目标图像
dstImg = uint8(dstImg);% 注意将dstImg从double类型转换为uint8类型
subplot(234);
imshow(dstImg);
title('均衡化图像','fontsize',18);
p = histogram(dstImg);% 计算均衡化图像的归一化直方图
subplot(235);
bar(0:255,p);
axis([0,255,0,max(p)*1.2]);
title('均衡化图像的归一化直方图','fontsize',18);
s = cum(p);% 计算均衡化图像的累积归一化直方图
subplot(236);
bar(0:255,s);
axis([0,255,0,max(s)*1.2]);
title('均衡化图像的累积归一化直方图','fontsize',18);
%% 函数定义:计算图像的归一化直方图
function p = histogram(srcImg)
    [rows,cols] = size(srcImg);
    h = zeros(1,256);% 保存各灰度级对应的像素点数
    for k = 0:255
        bw = (srcImg==k);% 原图像中值为k的像素点变为1,值不为k的像素点变为0,矩阵bw中所有元素的和即为灰度级k对应的像素点数
        h(k+1) = sum(bw(:));
    end
    p = h/(rows*cols);% 归一化,保存各灰度级出现的频率
end
%% 函数定义:计算图像的累积归一化直方图
function s = cum(p)
    s = zeros(1,256);
    for i = 1:256
        if (1==i)
            s(i) = p(1);
            continue;
        end
        s(i) = s(i-1)+p(i);
    end
end
%% 函数定义:灰度级映射
function dstImg = transform(srcImg,s)
    [rows,cols] = size(srcImg);
    dstImg = zeros(rows,cols);
    for k = 0:255
        bw = (srcImg==k);% 原图像中值为k的像素点变为1,值不为k的像素点变为0
        dstImg(bw) = s(k+1);% 原图像中值为k的像素点变为s(k+1)
    end
end

你可能感兴趣的:(matlab,计算机视觉,图像处理)