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灰度級,這樣可以使灰度值范圍比較窄的像素點,占據到整個圖像所允許范圍

  • 直方圖均衡化的目的:通過使得圖像的灰度級更加均勻,反映在圖像上使得相鄰的像素之間的差別增大,從而達到增大圖像對比度的效果


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM