图像处理大型科普—图像信息熵
哪里来的信息熵?
在很多图像处理的过程中,需要判别一个图像的清晰度,和图像分割结果的优劣,于是就引出了信息熵的概念,绝大多数时候,它都被用来作为评价图像的一个量化标准。
某度百科定义如下:
“信息熵这个词是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
(图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