天天看點

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

直方圖均衡化的MATLAB實作

目錄

      • 1、回顧----直方圖均衡化
      • 2、代碼實作

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

  • 基本原理

    直方圖均衡化方法的基本思想是:

    對在圖像中像素個數多的灰階級進行展寬,而對像素個數少的灰階級進行縮減,進而達到清晰圖像的目的

    因為灰階分布可在直方圖中描述,是以該圖像增強方法是基于圖像的灰階直方圖。

  • 直方圖均衡化的處理步驟

    ①求待處理圖像的直方圖h

    ②計算原圖的灰階分布機率hs →  h s ( i ) = h ( i ) / N f hs(i)=h(i)/N_f hs(i)=h(i)/Nf​     N f = m ∗ n N_f=m*n Nf​=m∗n

    Nf--圖像f的總體像素個數 (m,n分别為圖像的長和寬)

    hs--每個灰階級的分布機率,即每個像素在整個圖像中所占的比例 (i=0,1,…,255)

    ③計算原圖灰階的累計分布hp →  h p ( i ) = ∑ k = 0 i h s ( k ) h_p(i)=\displaystyle\sum_{k=0}^{i}h_s(k) hp​(i)=k=0∑i​hs​(k)

    (i=0,1,…,255)

    ④計算原、新圖灰階值的影射關系

    ⑤原、新圖灰階直方圖比較

2、代碼實作

實作程式如下圖所示:

直方圖均衡化函數:

% 直方圖均衡化
% 相比于非線性動态範圍調整,效果好,不需要參數
% F = 'img\pict1.png';
% [G] = dip(F);
% function [G] = imhisteq(F)
function [G] = dip(F)
F = imread(F);        % 讀入圖像,存放在圖像矩陣F中
[M,N,K] = size(F);    % 獲得輸入圖像尺寸
if(K>1)
    F = rgb2gray(F);  % 将RGB 圖像或顔色圖轉換為灰階圖
end
F = double(F);
hist_0 = GetImHist0(F,256)';  % 求直方圖
hist_1 = hist_0/(M*N);        % 求灰階分布機率
hp0 = cumsum(hist_1);         % 求原圖灰階累計分布 MATLAB中cumsum可用于求累計和
hp1 = round(hp0*255);         % 原新圖的映射  round函數:四舍五入
hp1(1) = 0;                   % 第1個元素強制設為0
% 求出每一個像素點的灰階值F(i,j),賦給新圖像的對應像素值G(i,j)
for i=1:M
    for j=1:N
        GrayScale = F(i,j);   % 原圖灰階值
        NewGrayScale = hp1(GrayScale+1);
        G(i,j) = NewGrayScale;
    end
end
% 将計算得到的新圖像矩陣中所有點的灰階值由double轉換為uint8,輸出圖像
figure,imshow(uint8(F));title('原圖');
figure,imshow(uint8(G));title('直方圖均衡化後的圖像');
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; 
    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
           

指令行視窗輸入如下代碼:

代碼執行結果:

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

繼續閱讀