图像处理大型科普—图像信息熵

  • Post author:
  • Post category:其他


图像处理大型科普—图像信息熵





哪里来的信息熵?

在很多图像处理的过程中,需要判别一个图像的清晰度,和图像分割结果的优劣,于是就引出了信息熵的概念,绝大多数时候,它都被用来作为评价图像的一个量化标准。

某度百科定义如下:


“信息熵这个词是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