Matlab实现直方图均衡化(基于自定义函数)

Matlalb实现直方图均衡化

直方图均衡化

直方图均衡化是一种使输出图像直方图近似服从均匀分布的变换算法,其计算步骤如下:

  1. 列出原始图像的灰度级 f j f_j fj,j=0,1,…,k,…,L-1,其中L是灰度级的个数。
  2. 统计各灰度值的像素数目 N j N_j Nj, j=0,1,…,k,…,L-1。
  3. 计算原始图像直方图各灰度级的频度Pj= N j n \frac{Nj}{n} nNj,j=0,1,2,…,k,…,L-1,其中n为原始图像总的像素数目。
  4. 计算累计分布函数C(f)= ∑ i = 0 k P j ( f j ) \displaystyle\sum_{i=0}^{k} P_j(f_j) i=0kPj(fj),j=0,1,2,…,k,…,L-1。
  5. 应用以下公式计算映射后的输出图像的灰度级 g i g_i gi,i=0,1,…,k,…,P-1,P为输出图像灰度级的个数:
    g i g_i gi=INT[ ( g m a x g_{max} gmax- g m i n g_{min} gmin)C(f)+ g m i n g_{min} gmin+0.5 ]
    式中,INT为取整符号。
  6. 统计映射后各灰度级的像素数目 n i n_i ni,i=0,1,…,k,…,P-1。
  7. 计算输出图像直方图 P g P_g Pg( g i g_i gi)= n i n \frac{n_i}{n} nni,i=0,1,…,k,…,P-1。
  8. f j f_j fj g i g_i gi的映射关系修改原始灰度级,从而获得直方图近似为均匀分布的输出图像。

Matlab代码实现

Histogram_equalization.m

function [output] = Histogram_equalization(input_image)
if numel(size(input_image)) == 3   %如果图像为rgb图像
    %this is a RGB image
    %here is just one method, if you have other ways to do the
    %equalization, you can change the following code
    r=input_image(:,:,1);
    v=input_image(:,:,2);
    b=input_image(:,:,3);
    r1 = hist_equal(r);
    v1 = hist_equal(v);
    b1 = hist_equal(b);
    output = cat(3,r1,v1,b1);    
else                              %图像为灰值图像
    [output] = hist_equal(input_image);  
end
    function [output2] = hist_equal(input_channel)
        [m,n]=size(input_channel);
        output2=zeros(m,n);
        N=zeros(256,1);
        P=zeros(256,1);
        C=zeros(256,1);
        for i=1:m                    %统计各灰度级个数
            for j=1:n
                N(input_channel(i,j)+1)=N(input_channel(i,j)+1)+1;
            end
        end
        for i=1:256                 %计算原始图像直方图各灰度级的频度
            P(i)=N(i)/(m*n);
        end
        C(1)=P(1);                  %计算累计分布函数
        for i=2:256
            C(i)=C(i-1)+P(i);
        end
        for i=1:m                   %通过映射关系获得输出直方图
            for j=1:n
                output2(i,j)=floor(255*C(input_channel(i,j)+1)+0.5);
            end
        end
        output2=uint8(output2);
    end
end 

代码效果展示

下图为均衡化后的图像
展示代码 test.m

clc;
clear;
close all;
I = imread('d:\test.jpg');
[J] = Histogram_equalization(I);
subplot(221), imshow(I);
subplot(222), imhist(I);
subplot(223), imshow(J);
subplot(224), imhist(J);

[1] MATLAB数字图像处理.张德丰.扫描版

  • 8
    点赞
  • 67
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值