系列文章目录
什么是图像熵
图像熵(image entropy)是图像“繁忙”程度的估计值。
图像熵表示为图像灰度级集合的比特平均数,单位比特/像素,也描述了图像信源的平均信息量。对于离散形式的二维图像,其信息熵的计算公式为:
—
对于上式,其中,pi 为每一灰度级出现的概率。
熵指的是体系的混乱的程度,对焦良好的图像的熵大于没有清晰对焦的图像,因此可以用熵作为一种对焦评价标准。熵越大,图像越清晰。
图像的熵是一种特征的统计形式,它反映了图像中平均信息量的多少,表示图像灰度分布的聚集特征,却不能反映图像灰度分布的空间特征,为了表征这种空间特征,可以在一维熵的基础上引入能够反映灰度分布空间特征的特征量来组成图像的二维熵。
图像熵的计算
C++实现
// calculate entropy of an image
double Entropy(Mat img)
{
// 将输入的矩阵为图像
double temp[256];
// 清零
for(int i=0;i<256;i++)
{
temp[i] = 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;
}
python实现
import cv2
import numpy as np
tmp = []
for i in range(256):
tmp.append(0)
val = 0
k = 0
res = 0
image = cv2.imread('C:/Users/shaw/Desktop/new/result/stand/squat_0.5_5_1.png',0)
img = np.array(image)
for i in range(len(img)):
for j in range(len(img[i])):
val = img[i][j]
tmp[val] = float(tmp[val] + 1)
k = float(k + 1)
for i in range(len(tmp)):
tmp[i] = float(tmp[i] / k)
for i in range(len(tmp)):
if(tmp[i] == 0):
res = res
else:
res = float(res - tmp[i] * (math.log(tmp[i]) / math.log(2.0)))
print res