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