歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux編程 >> Linux編程

matlab 直方圖歸一化

直方圖規定化

直方圖均衡化的優點是能自動增強整個圖像的對比度,但它的具體增強效果不易控制,處理的結果總是得到全局的均衡化的直方圖.實際工作中,有時需要變換直方圖使之成為某個特定的形狀,從而有選擇地增強某個灰度值范圍內的對比度,這時可采用比較靈活的直方圖規定化方法.直方圖規定化增強處理的步驟如下:

令Pr(r)和Pz(z)分別為原始圖像和期望圖像的灰度概率密度函數。如果對原始圖像和期望圖像均作直方圖均衡化處理,應有:

 

由於都是進行均衡化處理,處理後的原圖像概率密度函數Ps(S)及理想圖像概率密度函數PV(V)是相等的。

於是,我們可以用變換後的原始圖像灰度級S代替(2)式中的V。

即:Z = G - 1(S)

 

這時的灰度級Z 便是所希望的圖像的灰度級。

此外,利用(1)與(3)式還可得到組合變換函數

Z = G - 1[T(r)]

 

對連續圖像,重要的是給出逆變換解析式。對離散圖像而言,有

clear all;
close all;
clc;

I = imread('2-t.bmp');
L=256;           
NK=zeros(L,1);              %存儲原圖像直方圖數據
Rk_CDF_Normal=zeros(L,1);    %存儲直方圖規定化後的圖像的直方圖
Rk_pre=zeros(L,1);          %存儲原圖像累積直方圖數據
[row,col]=size(I);

%%
%獲取像素灰度級
for i = 1:row
    for j = 1:col
        num = double(I(i,j))+1;
        NK(num) = NK(num)+1;
    end
end

%計算直方圖概率估計
Ps = NK./numel(I);%存儲原圖像直方圖概率數據
%計算累積直方圖
for level=1:L
    if level==1
        Rk_pre(level)=Ps(level);
    else
        Rk_pre(level)=Rk_pre(level-1)+Ps(level);
    end
end

%%
%規定化直方圖,在這裡要得到2-s圖像的灰度直方圖
H = imread('2-s.jpg');
H = rgb2gray(H);
nk_normal = zeros(L,1);
Rk_normal = zeros(L,1);
[row,col] = size(H);

%獲取像素灰度級
for i = 1:row
    for j = 1:col
        num_normal = double(I(i,j))+1;
        nk_normal(num_normal) = nk_normal(num_normal)+1;
    end
end

%計算直方圖概率估計
Ps_normal = nk_normal./numel(H);
for level=1:L
    if level==1
        Rk_normal(level)=Ps_normal(level);
    else
        Rk_normal(level)=Rk_normal(level-1)+Ps_normal(level);
    end
end

%計算規定化累積直方圖
for level=1:L
    if level==1
        Rk_CDF_Normal(level)=Rk_normal(level);
    else
        Rk_CDF_Normal(level)=Rk_CDF_Normal(level-1)+Rk_normal(level);
    end
end

%%
%計算原圖像與目標圖像累計直方圖數值的差的絕對值
double ScMin=zeros(L,L);
for y=1:L
    for x=1:L
        ScMin(x,y)=abs(Rk_pre(y)'-Rk_CDF_Normal(x)');
    end
end
%建立映射
HisM=zeros(L:1);
for level_x=1:L
    min = 0;
    minV=ScMin(1,level_x);
    for level_y=1:L
        if(minV>ScMin(level_y,level_x))
            minV=ScMin(level_y,level_x);
            min = level_y;
        end
    end
    HisM(level_x)= min;
end

%將原圖像的每個像素灰度轉換為直方圖均衡化後的灰度
[row,col]=size(I);
New=I;
for x = 1:row
    for y = 1:col
        Num = double(I(x,y))+1;
        if Num==L
            New(x,y)=HisM(L);
        end
    end
end
figure;imshow(New),title('規定化後圖像');

 

Copyright © Linux教程網 All Rights Reserved