灰度差分统计法计算图像的对比度

灰度差分统计法计算图像的对比度
本文采用灰度差分统计法计算图像的对比度、角度方向二阶矩、熵、平均值来描述纹理图像的特征,具体原理如下:
设(x,y)为图像中的一点,该点与和它只有微小距离的点(x+△x,y+△y)的灰度差分值为
g△(x,y)=g(x,y)-g(x+△x,y+△y)
式中,g△为灰度差分。设灰度差分的所有可能取值共有m级,令点(x,y)在整幅图像上移动,累计出g△(x,y)取各个数值的次数,由此便可以做出g△(x,y)的直方图。由直方图可以知道g△(x,y)取值的概率p△(i),i在1~m之间取值
当较小的i值的概率p△(i)较大时,说明纹理较粗糙,当p△(i)的各个取值较接近时,即概率分布较平坦时,说明纹理较细。
对比度计算公式
CON = ∑i^2PΔ(i)
角度方向计算公式
ASM=CON = ∑i[PΔ(i)]^2,

ENT= -∑iPΔ(i)lg PΔ(i)
平均值
MEAN = 1/m ∑iPΔ(i)

结果如下:
以LINA作为示例
原图像
图像直方图
在这里插入图片描述

插入链接与图片

计算结果
在这里插入图片描述

#include<opencv2/opencv.hpp>
#include<opencv2/core/core.hpp>
#include<iostream>
#include<math.h>
using namespace std;
using namespace cv;
/*绘制直方图函数*/
void show_his(Mat &Image,Mat &HI)
{
	int channels = 0;    //计算图像的通道
	MatND disHist;        //配置输出的结果
	int histSize[] = { 256 };//将数值分组,每个灰度范围一组
	float midRanges[] = { 0, 256 };  //确定每个维度的取值范围
	const float *ranges[] = { midRanges };
	//调用calcHist函数,将直方图的信息存储到disHist
	calcHist(&Image, 1, &channels, Mat(), disHist, 1, histSize, ranges, true, false);
	Mat drawImage = Mat::zeros(Size(256, 256), CV_8SC3);//黑底的图像
	//计算直方图后像素的最大个数
	double g_dHistMaxValue;
	minMaxLoc(disHist, 0, &g_dHistMaxValue, 0, 0);
	for (int i = 0; i < 256; i++)  //遍历直方图数据
	{
		int value = cvRound(disHist.at<float>(i) * 256 * 0.9 / g_dHistMaxValue);

		line(drawImage, Point(i, drawImage.rows - 1), Point(i, drawImage.rows - 1 - value), Scalar(255, 255, 255));
		//参数   要绘制的线段的图像  线段的起点      线段的终点                               线段的颜色
	}
	 HI = drawImage.clone();
}
int main()
{
	Mat img = imread("lena.bmp");
	imshow("Lena", img);
	Mat mi;
	int row = img.rows;
	int col = img.cols;
	//CON=i*i*P(I)
	//计算i
	mi.create(row, col, img.type());
	for (int i = 0; i < row-1; i++)
		for (int j = 0; j < col; j++)
		{   
			//cout << "BEF" << int(img.ptr<uchar>(i)[j]) << endl;
			mi.at<Vec3b>(i, j) = img.at<Vec3b>(i + 1, j) - img.at<Vec3b>(i, j);
			//cout << "IMF:" << int(mi.ptr<uchar>(i)[j]) << endl;
		}
	//计算p(I)  差值的概率
	int new_cols = mi.cols;
	int new_rows = mi.rows;
	int gray[256] = { 0 };
	double gray_prob[256] = { 0 };
	int num = 0;// 像素的总个数
	//统计直方图各个像素灰度值
	for (int i = 0; i < mi.rows; i++)
	{
		uchar *p = mi.ptr<uchar>(i);
		for (int j = 0; j < mi.cols; j++)
		{
			int value = p[j];
			gray[value]++;
			num++;
		}
	}
	//计算直方图概率分布
	for (int i = 0; i < 256; i++)
	{
		gray_prob[i] = ((double)gray[i] / num);
	}
	double CON = 0;
	double ASM = 0;
	double ENT = 0;
	double MEAN = 0;
	double v = 1.0/ 255.0;
	for (int i = 0; i <= 255; i++)
	{
		CON += i*i*gray_prob[i];//计算CON
		ASM += gray_prob[i] * gray_prob[i];//计算角度方向二阶矩
		if (gray_prob[i]!=0)
		ENT += (0-gray_prob[i] * log10(gray_prob[i]));//计算熵
		MEAN += v*i*gray_prob[i];//计算平均值
	}
	Mat HI;
	show_his(mi,HI);
	imshow("差值i的直方图", HI);
	cout << "灰度差分统计法求得的对比度为:" << CON << endl;
	cout << "灰度差分统计法求得的角度方向二阶矩为" << ASM << endl;
	cout << "灰度差分统计法求得的熵" << ENT << endl;
	cout << "灰度差分统计法求得的平均值" << MEAN << endl;
	waitKey(0);
	return 0;
}
  • 5
    点赞
  • 62
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值