【问题标题】:What is the entropy of an image and how is it calculated?什么是图像的熵,它是如何计算的?
【发布时间】:2018-05-13 05:41:48
【问题描述】:

我知道这是像素的随机性。但是请帮助您了解如何以数学方式计算这种随机性。以及不同的图像会有不同的熵。

【问题讨论】:

  • 这并不是真正的随机性,而是每个值被赋予其他值的意外程度。因此,它与图像中存在的信息量有关。

标签: image-processing statistics entropy


【解决方案1】:

您也可以直接从您的img 计算香农熵。做吧:

import skimage.measure    
entropy = skimage.measure.shannon_entropy(img)

如果您想了解背后的数学原理:

import numpy as np
marg = np.histogramdd(np.ravel(img), bins = 256)[0]/img.size
marg = list(filter(lambda p: p > 0, np.ravel(marg)))
entropy = -np.sum(np.multiply(marg, np.log2(marg)))

首先,marg是二维灰度图像img的边缘分布。对于 8 位图像,bins 设置为 256。然后,您需要过滤掉等于 0 的概率,最后将剩余元素 np.multiply(marg, np.log2(marg)) 相加,如 Shannon's entropy 所定义。

【讨论】:

  • AttributeError: module 'skimage' has no attribute 'measure'
  • @mLstudent33 import skimage.measure
【解决方案2】:

图像的熵定义如下:

其中 是灰度级数(8 位图像为 256), 是像素具有灰度级 的概率, 是对数函数的底。

请注意,图像的熵与从图像的 GLCM(灰度共生矩阵)中提取的熵特征有很大不同。查看this post 了解更多信息。

根据您的要求,我附上了一个如何计算 GLCM 熵的示例:

首先我们导入必要的模块:

import numpy as np
from skimage.feature import greycomatrix

然后我们读取图片:

img = io.imread('https://i.stack.imgur.com/07DZW.png')

上图的GLCM(对应右边的像素)计算如下:

glcm = np.squeeze(greycomatrix(img, distances=[1], 
                               angles=[0], symmetric=True, 
                               normed=True))

最后我们应用这个公式来计算熵:

其中 表示 GLCM 的条目。

如果我们将 设置为2,则结果以bits表示。

entropy = -np.sum(glcm*np.log2(glcm + (glcm==0)))
# yields 10.704625483788325

【讨论】:

  • “对应右边的像素”是什么意思?关闭图像?
  • GLCM 模拟在给定偏移处同时出现的像素值的分布。在上面的示例中,用于计算 GLCM 的 偏移量 是“向右一个像素”。
  • @Tonechas 如果我想计算彩色图片的熵,我应该怎么做? .. 此代码仅适用于灰度。
  • 用颜色的联合概率(r, g, b)pʳᵍᵇ替换pᵢ,灰度概率i,就可以了。哟需要将此更改引入第一个公式。
猜你喜欢
  • 2010-10-05
  • 1970-01-01
  • 2021-01-07
  • 1970-01-01
  • 2015-08-05
  • 2017-04-16
  • 1970-01-01
  • 1970-01-01
  • 2016-07-16
相关资源
最近更新 更多