图像信息熵(一维熵 二维熵)opencv实现

一、图像信息熵

		 通过计算图像的一维熵/二维熵,可以判断图像清晰程度,通常作为一种对焦评价标准。熵越大,图像越清晰。常用图像的二维熵来进行对焦评价。

1. 一维熵

    	图像的一维熵表示图像中灰度分布的聚集特征所包含的信息量,令Pi 表示图像中灰度值为i的像素所占的比例,则定义灰度图像的一元灰度熵为:

H = − P i ∑ i = 0 255 l o g P i H=-P_{i}\sum_{i=0}^{255}{log{P_i}} H=Pii=0255logPi

		Pi是某个灰度在该图像中出现的概率,可由灰度直方图获得。
    	代码实现:
在这里插入代码片
```int Entropy1D(cv::Mat src, double &dEntropyValue)
{
	if (src.empty())
		return -1;
	if (1 != src.channels())
		return -1;


	double temp[256] = { 0.0 };

	for (int r = 0; r < src.rows; r++){
		const uchar* pData = src.ptr<uchar>(r);
		for (int c = 0; c < src.cols; c++){
			temp[pData[c]]++;
		}
	}

	int iSize = src.cols * src.rows;
	for (int i = 0; i < 256; i++)
		temp[i] /= iSize;

	dEntropyValue = 0;
	for (int i = 0; i < 256; i++)
	{

		if (temp[i] < DBL_EPSILON)
			dEntropyValue = dEntropyValue;
		else
			dEntropyValue -= temp[i] * (log(temp[i]) / log(2.0));
	}

	return 0;
}

2.二维熵

		图像的一维熵可以表示图像灰度分布的聚集特征,却不能反映图像灰度分布的空间特征,为了表征这种空间特征,可以在一维熵的基础上引入能够反映灰度分布空间特征的特征量来组成图像的二维熵。选择图像的邻域灰度均值作为灰度分布的空间特征量,与图像的像素灰度组成特征二元组,记为( i, j ),其中i 表示像素的灰度值(0 <= i <= 255),j 表示邻域灰度均值(0 <= j <= 255):

P i , j = f ( i , j ) / N 2 P_{i,j} = f(i,j) / N^{2} Pi,j=f(i,j)/N2
上式能反应某像素位置上的灰度值与其周围像素灰度分布的综合特征,其中f(i, j)为特征二元组(i, j)出现的频数,N 为图像的尺度(注意,此处的图像尺寸可以不同)。
H = − ∑ i ∑ j P ( i , j ) l o g P ( i , j ) H = - \sum_{i}\sum_{j}P(i,j)logP(i,j) H=ijP(i,j)logP(i,j)

实现思路:
利用opencv中的Mat类,表示上式中的特征二元组,其他计算方式与一维信息熵类似。

    运行环境:系统:windows10  cpu:  i5 
    测试图像尺寸:800 * 600,核尺寸: 5 * 5
    耗时(平均):< 2ms(速度杠杠的)

参考文献:
1. https://blog.csdn.net/qq_42261630/article/details/118639339

你可能感兴趣的:(图像处理,自动对焦,opencv,计算机视觉,视觉检测)