Matlab实现直方图均衡化

直方图均衡化

算法分析

  1. 对原图像每个通道统计0-255的灰度级概率

  2. 求原图像每个通道累积概率分布

  3. 根据累积概率直方图分别对每个通道(K)求每个像素点的映射

    p(k, i) = p(k, i) * 255

function outputimg = myhisteq( A )
% 直方图均衡化
% 参数A是读入的图像矩阵
% outputimg是经过直方图均衡化的图像

[H,W,K] = size(A);
P = zeros(K,256); %用于统计各个通道灰度级概率的行向量

%统计每个通道0-255灰度级的概率
for k = 1:K
    for v = 0:255
        P(k,v + 1) = length(find(A(:,:,k) == v)) / (H * W);
    end
end

%求累积概率分布
for k = 1 : K
    for i = 2 : 256
        P(k, i) = P(k, i - 1) + P(k, i);
    end
end

%映射到0-255
for k = 1: K   
    P(k,:) = round(P(k,:) * 255); 
end

outputimg = zeros(H,W,K);

%对新图像每一个像素点映射
for k = 1:K
    for i = 1:H
        for j = 1 :W
            outputimg(i,j,k) = P(k, A(i, j, k) + 1);
        end
    end
end
      
outputimg = uint8(outputimg);
end

实验结果

%调用示例:
A = imread('lena.png');
B = myhisteq(A);
subplot(1,2,1),imshow(A),title('原图');
ubplot(1,2,2),imshow(B),title('直方图均衡');

实验分析

  • 第一步统计原图中每个灰度级出现的概率,这里注意计数数组下标是从1-256,但是灰度值是从0-255
   for k = 1:K
      for v = 0:255
          P(k,v + 1) = length(find(A(:,:,k) == v)) / (H * W);  %这里是v+1
      end
  end  

这里调用了Matlab中自带的find和length函数,另外也可以使用以下语句分两步实现,先统计灰度级的频数,再求概率

% 统计每个像素值出现次数
count = zeros(1, 256);
for i = 1 : R
    for j = 1 : C
        %f(i,j)中的像素值是从0-255,数组下标是从1-256  
        count(1, fx(i, j) + 1) = count(1, fx(i, j) + 1) + 1;
    end
end
% 统计每个像素值出现的概率, 得到概率直方图
for i = 1 : 256
    T(1, i) = count(1, i) / (R * C);
end
  • 求完累积概率分布,将概率映射到0-255灰度级,这样可以使灰度值范围比较窄的像素点,占据到整个图像所允许范围

  • 直方图均衡化的目的:通过使得图像的灰度级更加均匀,反映在图像上使得相邻的像素之间的差别增大,从而达到增大图像对比度的效果

posted @ 2020-11-03 19:31  简约的信仰  阅读(1006)  评论(0编辑  收藏  举报