圖像處理大型科普—圖像信息熵

圖像處理大型科普—圖像信息熵



哪裏來的信息熵?

在很多圖像處理的過程中,需要判別一個圖像的清晰度,和圖像分割結果的優劣,於是就引出了信息熵的概念,絕大多數時候,它都被用來作爲評價圖像的一個量化標準。

某度百科定義如下:

“信息熵這個詞是C.E.香農從熱力學中借用過來的。熱力學中的熱熵是表示分子狀態混亂程度的物理量。香農用信息熵的概念來描述信源的不確定度。”

或許這句話中唯一能帶來一點點信息量的就是一個“熵”字了, 這不禁讓我回想起了那年的化學課堂,老師在講臺上提了提褲腰帶說道:“熵這個東西吧,我舉個栗子你們就很快明白了,假設咱班是一團物質A,隔壁班是一團物質B,熵就是用來形容課堂紀律的,瞧你們一個個坐的稀稀拉拉,左搖右晃,人頭攢動,那麼這團物質A的熵就會比較大,人家隔壁班一個個端端正正,目不轉睛,聚精會神,熵就小得不得了了,簡單來說,一團物質內部結構 越亂,熵越大,反之則小。”

那麼我大概猜測信息熵就是說一個信息的凌亂程度咯?

於是又在某度上找到了另一版詞條:

“熵被用來衡量一個隨機變量出現的期望值。它代表了在被接收之前,信號傳輸過程中損失的信息量,又被稱爲信息熵”

(哎~必須得吐槽一下,百度百科的死板程度堪比教科書,感覺怎麼讓人懵逼怎麼寫。。。)
不過上述很關鍵的一句話是,熵被用來一個隨機變量出現的期望值,對於一張圖片來說,這個隨機的變量就是指得圖片中每一個位置的像素值(什麼,你說RGB有三個值?我們討論的是灰度圖好咩~~)。

實際上,通過求信息熵的過程去理解會更簡單。鋪出在網上找到一段求信息熵的代碼(C++):

double Entropy(Mat img)
{

//開闢內存
double temp[256] = { 0.0 };

// 計算每個像素的累積值
for (int m = 0; m < img.rows; m++)
{// 有效訪問行列的方式
    const uchar* t = img.ptr<uchar>(m);
    for (int n = 0; n < img.cols; n++)
    {
        int i = t[n];
        temp[i] = temp[i] + 1;
    }
}

// 計算每個像素的概率
for (int i = 0; i < 256; i++)
{
    temp[i] = temp[i] / (img.rows*img.cols);
}

double result = 0;
// 計算圖像信息熵
for (int i = 0; i < 256; i++)
{
    if (temp[i] == 0.0)
        result = result;
    else
        result = result - temp[i] * (log(temp[i]) / log(2.0));
}

return result;

}

對應的matlab代碼:

function [res] = ImgEntropy(I)
%求圖像熵值
%傳入一張彩色圖片的矩陣
%輸出圖片的圖像熵值

I_gray = rgb2gray(I);
[ROW,COL] = size(I_gray);


%%
%新建一個size =256的矩陣,用於統計256個灰度值的出現次數
temp = zeros(256);
for i= 1:ROW

for j = 1:COL
%統計當前灰度出現的次數
temp(I_gray(i,j)+1)= temp(I_gray(i,j)+1)+1;

end
end

%%

res = 0.0 ; 
for  i = 1:256
%計算當前灰度值出現的概率
temp(i) = temp(i)/(ROW*COL);

%如果當前灰度值出現的次數不爲0
if temp(i)~=0.0

res = res - temp(i) * (log(temp(i)) / log(2.0));
end
end
disp(res);
end

文中代碼相當於做了三件事情:

  1. 便利整個圖像矩陣,獲取每一個出現灰度值
  2. 求得每個灰度值在圖像矩陣中出現的概率
  3. 根據一定得計算方式,統計灰度值的總期望

    我們嘗試把若干張圖片帶入這個過程

    第一張圖片爲全白 (白到連邊框都沒有一個~~), 計算後灰度值期望爲0

(圖1)

第二張爲全黑,灰度值期望同樣爲0

(圖2)

第三張爲黑白相間,灰度值期望大於0

(圖3)

再來一張更加密集的黑白相間圖,期望值更大了

(圖4)

結果圖(分別對應1、2、3、4圖):

So,對於人來說,一張黑色的圖和一張白色的圖的信息量是一樣大,我們只能獲取到它的顏色信息,

第三張中添加了黑白相間的風格,我們看見了黑白兩種顏色,還可以觀察出黑色和白色的間距,黑色的出現規律

相比第一第二張圖,它攜帶的信息量更加大了。

在生活中,同樣只有黑白兩種顏色的就數二維碼最有代表性了,你能想象只有四個格子的二維碼麼?一個格子有兩種顏色,分別代表0和1,那麼這種二維碼量化後的取值範圍就是0000~1111,也就是4個bit的,這也就代表着這張二維碼可攜帶的信息量是4個bit,所以通常情況下,我們見不到這樣的二維碼,it’s too small to save information…

當二維碼的格子數不斷增加,所攜帶的信息量也不斷增加,簡單來說,二維碼的格子數,這意味着二維碼的信息量。

這就是二維碼的信息熵


以上都是鋪墊,至少現在我們能理解黑白圖的信息量問題了,摘掉色弱眼鏡,接下來進入彩色的世界

這是單反相機拍攝的一張照片,

(圖5)

這是用手機拍的一張

(圖6)

哪個看起來更加清楚,更加有意境?

實際上人的眼睛是一個帶了各種逆天算法並且跑在一臺生物超算(大腦)上超級攝像頭

只用一瞬間,我們就能提取出物體的結構信息,並判斷出那張圖片更加優雅,更加好看,更加清晰。

肉眼觀察很明顯,單反的照片過渡更加自然,物體的顏色更加飽滿豐富。

結論毋庸置疑:圖5比圖6更加清楚。

計算機又是如何理解?

接下來我們來測量他們的信息熵,爲了排除像素數量對結果的影響,我們把圖片縮放到相同大小,然後按照上述的算法跑值:

結果如上

在計算機中,色彩表現爲數字,那麼色彩的豐富度就可以用概率來量化,如果每個像素值出現的概率都不爲零,我們就有理由相信這是一張顏色豔麗的照片,而這個概率最終的量化結果,又恰恰就是信息熵所擬合的值。

計算機:像素值概率分佈均衡==色彩豔麗

人眼: 色彩豔麗==輪廓清楚==清楚

所以我們可以認爲,熵值大==色彩豔麗

甚至某些情況下,熵值大==色彩豔麗==圖像輪廓清楚==清楚

信息熵更大的作用

要讓 “熵值大==色彩豔麗==圖像輪廓清楚==清楚 ” 成立

那麼只需要滿足 “色彩豔麗==輪廓清楚” 就可以成立

哈,巧了,有一種情況剛好能滿足這個條件 ———— 光學對焦

想必大家應該都有使用顯微鏡的經歷,如果焦距沒調準,就只能看到一片白色

當粗略的找到物體的成像時,再慢慢扭動細準焦微調焦距,物體才慢慢變得輪廓清晰。

細心的同學很容易發現,整個過程的色彩豐富度和輪廓的清晰度是成正比的有沒有?

所以當前情況下,我們完全可以通過畫面的熵值來衡量畫面的清晰度,以此來判斷焦距的走向。。。

沒錯,電動顯微鏡(注意不是電子顯微鏡哈)的自動對焦就是這樣實現的(親測很有效,並且計算量很小哦~)

over

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