圖像處理大型科普—圖像信息熵
哪裏來的信息熵?
在很多圖像處理的過程中,需要判別一個圖像的清晰度,和圖像分割結果的優劣,於是就引出了信息熵的概念,絕大多數時候,它都被用來作爲評價圖像的一個量化標準。
某度百科定義如下:
“信息熵這個詞是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
文中代碼相當於做了三件事情:
- 便利整個圖像矩陣,獲取每一個出現灰度值
- 求得每個灰度值在圖像矩陣中出現的概率
根據一定得計算方式,統計灰度值的總期望
我們嘗試把若干張圖片帶入這個過程
第一張圖片爲全白 (白到連邊框都沒有一個~~), 計算後灰度值期望爲0
第二張爲全黑,灰度值期望同樣爲0
第三張爲黑白相間,灰度值期望大於0
再來一張更加密集的黑白相間圖,期望值更大了
結果圖(分別對應1、2、3、4圖):
So,對於人來說,一張黑色的圖和一張白色的圖的信息量是一樣大,我們只能獲取到它的顏色信息,
第三張中添加了黑白相間的風格,我們看見了黑白兩種顏色,還可以觀察出黑色和白色的間距,黑色的出現規律
相比第一第二張圖,它攜帶的信息量更加大了。
在生活中,同樣只有黑白兩種顏色的就數二維碼最有代表性了,你能想象只有四個格子的二維碼麼?一個格子有兩種顏色,分別代表0和1,那麼這種二維碼量化後的取值範圍就是0000~1111,也就是4個bit的,這也就代表着這張二維碼可攜帶的信息量是4個bit,所以通常情況下,我們見不到這樣的二維碼,it’s too small to save information…
當二維碼的格子數不斷增加,所攜帶的信息量也不斷增加,簡單來說,二維碼的格子數,這意味着二維碼的信息量。
這就是二維碼的信息熵
以上都是鋪墊,至少現在我們能理解黑白圖的信息量問題了,摘掉色弱眼鏡,接下來進入彩色的世界
這是單反相機拍攝的一張照片,
這是用手機拍的一張
哪個看起來更加清楚,更加有意境?
實際上人的眼睛是一個帶了各種逆天算法並且跑在一臺生物超算(大腦)上超級攝像頭
只用一瞬間,我們就能提取出物體的結構信息,並判斷出那張圖片更加優雅,更加好看,更加清晰。
肉眼觀察很明顯,單反的照片過渡更加自然,物體的顏色更加飽滿豐富。
結論毋庸置疑:圖5比圖6更加清楚。
計算機又是如何理解?
接下來我們來測量他們的信息熵,爲了排除像素數量對結果的影響,我們把圖片縮放到相同大小,然後按照上述的算法跑值:
結果如上
在計算機中,色彩表現爲數字,那麼色彩的豐富度就可以用概率來量化,如果每個像素值出現的概率都不爲零,我們就有理由相信這是一張顏色豔麗的照片,而這個概率最終的量化結果,又恰恰就是信息熵所擬合的值。
計算機:像素值概率分佈均衡==色彩豔麗
人眼: 色彩豔麗==輪廓清楚==清楚
所以我們可以認爲,熵值大==色彩豔麗
甚至某些情況下,熵值大==色彩豔麗==圖像輪廓清楚==清楚
信息熵更大的作用
要讓 “熵值大==色彩豔麗==圖像輪廓清楚==清楚 ” 成立
那麼只需要滿足 “色彩豔麗==輪廓清楚” 就可以成立
哈,巧了,有一種情況剛好能滿足這個條件 ———— 光學對焦
想必大家應該都有使用顯微鏡的經歷,如果焦距沒調準,就只能看到一片白色
當粗略的找到物體的成像時,再慢慢扭動細準焦微調焦距,物體才慢慢變得輪廓清晰。
細心的同學很容易發現,整個過程的色彩豐富度和輪廓的清晰度是成正比的有沒有?
所以當前情況下,我們完全可以通過畫面的熵值來衡量畫面的清晰度,以此來判斷焦距的走向。。。
沒錯,電動顯微鏡(注意不是電子顯微鏡哈)的自動對焦就是這樣實現的(親測很有效,並且計算量很小哦~)