目錄
直方圖處理技術(shù)概述
直方圖均衡化
公式推導(dǎo)?
Matlab代碼實(shí)現(xiàn)
圖像的規(guī)定化
數(shù)學(xué)推導(dǎo)
單映射
Matlab代碼
效果展示?編輯
?組映射
Matlab代碼
直方圖處理技術(shù)概述
灰度級(jí)范圍[0,L-1]的數(shù)字圖像,在實(shí)際使用中,用哥灰度級(jí)的像素總數(shù)除以MN的整幅圖像的像素?cái)?shù)量,歸一化到規(guī)律中進(jìn)行計(jì)算,這樣可以解除面積對(duì)哥灰度級(jí)在所有橡樹中分布的影響,僅僅靠概率進(jìn)行分析個(gè)灰度級(jí)的分布。
在較暗的圖像中,直方圖的分量集中在灰度級(jí)的低段。
低對(duì)比度圖像具有較窄的直方圖,且都集中于[0,L-1]的灰度級(jí)的某一部分,較為集中。
高對(duì)比度圖像的直方圖的分量覆蓋了很寬的灰度范圍,且像素?cái)?shù)量的分布也沒有太不均勻,只有少數(shù)灰度級(jí)的像素?cái)?shù)量要高出許多。
可以直觀的得出結(jié)論:若以一幅圖像的像素占據(jù)整個(gè)可能的灰度級(jí)并且均與分布,則該圖像會(huì)有高對(duì)比度的圖像外觀并展示灰色調(diào)的較大變化,最終效果會(huì)得到一幅灰度細(xì)節(jié)豐富且動(dòng)態(tài)范圍較大的圖像。
直方圖均衡化
直方圖均衡化,其目的是為了將圖像中的一些動(dòng)態(tài)范圍較小、較集中的的灰度級(jí)改變,讓圖像的灰度級(jí)分布的更為均與一些。可以依據(jù)輸入的圖像就能得到一個(gè)變換函數(shù)來自動(dòng)的實(shí)現(xiàn)直方圖分布均勻的效果。
我對(duì)于直方圖的推到論文并沒有看過,所有最底層的細(xì)節(jié)不太了解。全基于我對(duì)于均衡化的計(jì)算理解。
從實(shí)際情況分析
觀察這張圖的直方圖,在整個(gè)[0,255]的灰度級(jí)中,大部分的灰度級(jí)都是集中在較高的灰度部分。整個(gè)圖片都是偏亮。我們希望提高圖像的對(duì)比度,讓圖像的更多細(xì)節(jié)變的突出,同時(shí)希望圖像不要太亮,讓灰度級(jí)像素分布均勻一些。
所以,我們的目的是希望挪動(dòng)直方圖的灰度級(jí),而不是修改直方圖的灰度級(jí)的數(shù)量,大規(guī)模修改灰度級(jí)的像素的數(shù)量會(huì)改變整幅圖像。且會(huì)影響灰度級(jí)的分布,有需要重新取計(jì)算,所有我們的目的是,不修改各自灰度級(jí)的像素?cái)?shù)量,而是僅僅移動(dòng)灰度級(jí)。
?r是指原始圖像的灰度級(jí),s是目的變換后的灰度級(jí)。
可以列出某種函數(shù)關(guān)系
變換前與變換后都是要滿足同樣的灰度級(jí)范圍。
在輸入一個(gè)灰度級(jí)的像素,經(jīng)過變換后就是輸出后的一個(gè)新的灰度級(jí)。
關(guān)于變換函數(shù),可以得到其反變換,也就是反函數(shù)
而函數(shù)存在反函數(shù)的情況是,函數(shù)是一個(gè)嚴(yán)格單調(diào)遞增函數(shù),這樣才不會(huì)出現(xiàn)一對(duì)多的二義性矛盾。
但是在于實(shí)際的圖片的變換情況下是,任然存在多個(gè)灰度級(jí)變換后變成一個(gè)灰度級(jí)的情況,也就是多對(duì)一情況。這是因?yàn)?,作用于圖像的整數(shù),是任然存在多對(duì)一的情況。
?對(duì)于圖像的不同的灰度級(jí),對(duì)于不同的灰度級(jí)的灰度數(shù)量,在整幅圖像的分布,可以用概率來替代表示,這是屬于歸一化的思想。
公式推導(dǎo)?
?得到r的s映射關(guān)系后,可以通過相應(yīng)的映射可以進(jìn)行灰度級(jí)變換。
Matlab代碼實(shí)現(xiàn)
mat1=imread("Image\gray.jpg");
mat2=mat1;
L=256;
%統(tǒng)計(jì)一副圖像的不同灰度級(jí)的在圖像中的概率密度(該灰度級(jí)的像素?cái)?shù)量/整個(gè)圖像的像素總數(shù)量)
[M,N]=size(mat1);
probaDensity=zeros(1,L);%從1開始到256-[0,255]
for a=1:M
for b=1:N
probaDensity(mat1(a,b)+1)=probaDensity(mat1(a,b)+1) + 1;
end
end
for a=1:L
probaDensity(a)=probaDensity(a)/(M*N);
end
%bar(1:L,probaDensity)
%計(jì)算累計(jì)概率密度-s=T(r)=積分p(r)*(L-1)*dr
cumprobaDensity=zeros(1,L);
cumprobaDensity(1)=probaDensity(1);
for a=2:L
cumprobaDensity(a)=cumprobaDensity(a-1)+probaDensity(a);
end
%完成變換,乘以(L-1)取整,完成s的映射,可以構(gòu)建s的映射表
S=zeros(1,L);
for a=1:L
S(a)=uint8(cumprobaDensity(a)*(L-1)+0.5);
end
%bar(1:L,S)
%完成了r-s的映射表,然后遍歷圖像,將圖像的灰度級(jí)(r)對(duì)應(yīng)到變換后的s
for a=1:M
for b=1:N
mat2(a,b)=S(mat2(a,b)+1);
end
end
figure,
subplot(221),imhist(mat1),title("原直方圖")
subplot(222),imhist(mat2),title("均衡化直方圖")
subplot(223),imshow(mat1),title("原圖")
subplot(224),imshow(mat2),title("均衡化");
clf;
效果展示
?這樣一來,灰度級(jí)分布的較為均勻,基本上在[0,L-1]的灰度級(jí)都覆蓋到了。均衡化后的圖像對(duì)比度提升,細(xì)節(jié)增加。
圖像的規(guī)定化
規(guī)定化,其本身與均衡化一樣,不過均衡化的變換函數(shù)/增強(qiáng)函數(shù)是由圖像自動(dòng)決定的,讓圖像的灰度級(jí)變的更為均勻。而規(guī)定化可以讓我們自己指定希望變換的圖像的增強(qiáng)函數(shù)。讓我們可以達(dá)到自己想要的效果??梢赃x擇讓灰度級(jí)集中到低灰度級(jí)區(qū)域,讓陰影的細(xì)節(jié)更為豐富。
我們提供一個(gè)圖像,以其的直方圖作為變換的模板。
?我們提供了兩張圖,兩張圖都進(jìn)行變換,然后得到兩個(gè)的映射函數(shù)表,再進(jìn)行一次映射,可以得到新的映射表。
數(shù)學(xué)推導(dǎo)
關(guān)鍵是在于怎么完成Sr到z的反映射。
有兩種方法-單映射與組映射,也就是SML與GML算法。
單映射
根據(jù)SML的思想,以為基準(zhǔn),讓去查找,差值的絕對(duì)值最小的哪個(gè)灰度級(jí)就是新映射的灰度級(jí)。
Matlab代碼
mat1=imread("Image\原圖.jpg");
tmat1=mat1;
mat0=imread("Image\規(guī)定圖.jpg");
tmat0=mat0;
L=256;
[M1,N1]=size(tmat1);
[M0,N0]=size(tmat0);
%%統(tǒng)計(jì)r與z的概率密度
density0=zeros(1,L);
density1=zeros(1,L);
for a=1:M0
for b=1:N0
density0(tmat0(a,b)+1)=density0(tmat0(a,b)+1)+1;
end
end
for a=1:M1
for b=1:N1
density1(tmat1(a,b)+1)=density1(tmat1(a,b)+1)+1;
end
end
for a=1:L
density1(a)=density1(a)/(M1*N1);
density0(a)=density0(a)/(M0*N0);
end
%%分別得到關(guān)于r的T(r)-累計(jì)概率密度*(L-1)
%%關(guān)于z的G(z)-累計(jì)概率密度*(l-1)
cumdensity0=zeros(1,L);
cumdensity1=zeros(1,L);
cumdensity0(1)=density0(1);
cumdensity1(1)=density1(1);
for a=2:L
cumdensity0(a)=cumdensity0(a-1)+density0(a);
cumdensity1(a)=cumdensity1(a-1)+density1(a);
end
% bar(1:L,cumdensity0)
% bar(1:L,cumdensity1)
%%完成了量組對(duì)于S的映射,還需要關(guān)于Sr的反映射到z
%找Sr與Sk中差值最小的
Rz1=zeros(1,L);
%為避免取整誤差,直接用累計(jì)概率密度進(jìn)行計(jì)算
%%單映射以z為基準(zhǔn),進(jìn)行r中的查找最小的開始映射
temp=0.0;
for a=1:L
temp=cumdensity1(a);
MinDen=1.0;
minIndex=1;
for b=1:L
if abs(temp-cumdensity0(b)) <= MinDen
minIndex=b;
MinDen=abs(temp-cumdensity0(b));
end
end
%可以找出最小的差值和下標(biāo)
Rz1(a)=minIndex;
end
for a=1:M1
for b=1:N1
tmat1(a,b)=Rz1(tmat1(a,b));
end
end
figure,
subplot(231),imhist(mat1),title("原直方圖")
subplot(232),imhist(mat0),title("規(guī)定直方圖")
subplot(233),imhist(tmat1),title("單映射直方圖")
subplot(234),imshow(mat1),title("原圖");
subplot(235),imshow(mat0),title("規(guī)定圖");
subplot(236),imshow(tmat1),title("單映射后圖");
clf;
%%組映射以r為基準(zhǔn),查找r中的累計(jì)概率密度的最小差值
效果展示
?組映射
都說單映射的查找方法是存在誤差的,所以提供了組映射。
組映射與單映射反過來,以原圖圖的為基準(zhǔn),讓規(guī)定圖的去查找原圖中累計(jì)概率密度的差值的絕對(duì)值最小的哪個(gè)灰度級(jí),依次為一個(gè)分別,讓從0到這個(gè)灰度級(jí)之間的所有灰度級(jí)都映射到當(dāng)前的規(guī)定圖的灰度級(jí),然后更新邊界,直到下一次找到最小的邊界。
具體組映射和單映射的理解可以參考直方圖規(guī)定化:?jiǎn)斡成湟?guī)則、組映射規(guī)則的手動(dòng)求解過程_Nefu_lyh的博客-CSDN博客_直方圖規(guī)定化例題
這個(gè)博主講解的還是很清晰的。
Matlab代碼
mat1=imread("Image\原圖.jpg");
tmat1=mat1;
mat0=imread("Image\規(guī)定圖.jpg");
tmat0=mat0;
L=256;
[M1,N1]=size(tmat1);
[M0,N0]=size(tmat0);
%%統(tǒng)計(jì)r與z的概率密度
density0=zeros(1,L);
density1=zeros(1,L);
for a=1:M0
for b=1:N0
density0(tmat0(a,b)+1)=density0(tmat0(a,b)+1)+1;
end
end
for a=1:M1
for b=1:N1
density1(tmat1(a,b)+1)=density1(tmat1(a,b)+1)+1;
end
end
for a=1:L
density1(a)=density1(a)/(M1*N1);
density0(a)=density0(a)/(M0*N0);
end
%%分別得到關(guān)于r的T(r)-累計(jì)概率密度*(L-1)
%%關(guān)于z的G(z)-累計(jì)概率密度*(l-1)
cumdensity0=zeros(1,L);
cumdensity1=zeros(1,L);
cumdensity0(1)=density0(1);
cumdensity1(1)=density1(1);
for a=2:L
cumdensity0(a)=cumdensity0(a-1)+density0(a);
cumdensity1(a)=cumdensity1(a-1)+density1(a);
end
%%完成了量組對(duì)于S的映射,還需要關(guān)于Sr的反映射到z
%找Sr與Sk中差值最小的
Rz2=zeros(1,L);
%為避免取整誤差,直接用累計(jì)概率密度進(jìn)行計(jì)算
%%組映射以r為基準(zhǔn),查找r中的累計(jì)概率密度的最小差值,以組為單位進(jìn)行映射
%設(shè)置一個(gè)邊界,在查找完一輪后,映射區(qū)域內(nèi)的r,然后更新邊界
bound=1;
temp=0.0;
for a=1:L
temp=cumdensity0(a);
MinDen=1.0;
minIndex=1;
for b=1:L
if abs(temp-cumdensity1(b))<=MinDen
minIndex=b;
MinDen=abs(temp-cumdensity1(b));
end
end
%查找完,開始映射[bound,minIndex]
for cd=bound:minIndex
Rz2(cd)=a;
end
%更新邊界
bound=minIndex+1;
end
for a=1:M1
for b=1:N1
tmat1(a,b)=Rz2(tmat1(a,b));
end
end
figure,
subplot(231),imhist(mat1),title("原直方圖")
subplot(232),imhist(mat0),title("規(guī)定直方圖")
subplot(233),imhist(tmat1),title("組映射直方圖")
subplot(234),imshow(mat1),title("原圖");
subplot(235),imshow(mat0),title("規(guī)定圖");
subplot(236),imshow(tmat1),title("組映射后圖");
clf;
效果展示文章來源:http://www.zghlxwxcb.cn/news/detail-425373.html
文章來源地址http://www.zghlxwxcb.cn/news/detail-425373.html
到了這里,關(guān)于【數(shù)字圖像處理】直方圖均衡化與規(guī)定化的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!