【數字圖像處理】MATLAB實現直方圖均衡化

直方圖均衡化的MATLAB實現


回顧----直方圖均衡化

  • 基本原理
    直方圖均衡化方法的基本思想是:
    對在圖像中像素個數多的灰度級進行展寬,而對像素個數少的灰度級進行縮減,從而達到清晰圖像的目的
    因爲灰度分佈可在直方圖中描述,所以該圖像增強方法是基於圖像的灰度直方圖。
  • 直方圖均衡化的處理步驟
    ①求待處理圖像的直方圖h
    ②計算原圖的灰度分佈概率hs → hs(i)=h(i)/Nfhs(i)=h(i)/N_f     Nf=mnN_f=m*n
       Nf--圖像f的總體像素個數 (m,n分別爲圖像的長和寬)
       hs--每個灰度級的分佈概率,即每個像素在整個圖像中所佔的比例 (i=0,1,…,255)
    ③計算原圖灰度的累計分佈hp → hp(i)=k=0ihs(k)h_p(i)=\displaystyle\sum_{k=0}^{i}h_s(k)
       (i=0,1,…,255)
    ④計算原、新圖灰度值的影射關係
    ⑤原、新圖灰度直方圖比較


代碼實現


實現程序如下圖所示:

% 直方圖均衡化
% function [J] = imhisteq0(I)
function [J] = dip(I)
I = imread('img\person.jpg');
figure,imshow(I)
[m,n,l] = size(I);
if(l>1)
    I = rgb2gray(I);
end
nbins = 256;
hist_0 = GetImHist0(I,nbins)';  %求直方圖
hist_1 = hist_0/(m*n);          %求灰度分佈概率
hp_0 = cumsum(hist_1);          %求原圖灰度累計分佈 MATLAB中cumsum可用於求累計和
hp_1 = round(hp_0*255); 
hp_1(1) = 0;                    %1個元素強制設爲0

I0 = double(I);

for i=1:m
    for j=1:n
        GrayScale = I0(i,j);    %原圖灰度值
        NewGrayScale = hp_1(GrayScale+1);
        J(i,j) = NewGrayScale;
    end
end
J = uint8(J);
figure,imshow(J)
end
% 直方圖
function counts = GetImHist0(Im,nbins) 
% nbins箱子 區間的個數
[row,col,cChannel] = size(Im); 
% cChannel顏色通道
counts = zeros(nbins,1);
minV = 0;
maxV = 255;
if(cChannel>1)
    disp('Input error');
else
    Im = double(Im);
    Im2 = reshape(Im,row*col,1);
    delta = (maxV-minV)/nbins;
    splitVs = 0:nbins;
    splitVs = splitVs*delta; %splitVs = linspace(minV,maxV,nbins+1)
    i=1;
    ind = find(Im2>=splitVs(i) & Im2<=splitVs(i+1));
    counts(i) = length(ind);
    for i = 2:nbins
        ind = find(Im2>splitVs(i) & Im2<=splitVs(i+1));
        counts(i) = length(ind);
    end
end
end

代碼執行結果:
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章