使用VC++设计程序:对于一幅256级灰度图像,求其一元熵值、二维熵值

数字图像处理--实验二B图像的一维熵与二维熵算法

获取源工程可访问gitee可在此工程的基础上进行学习。

本文主要是对图像进行一维熵以及二维熵的计算,下面附有实现的代码

文章目录

  • 数字图像处理--实验二B图像的一维熵与二维熵算法
    • [一、 实验内容](#一、 实验内容)
    • [二、 一维熵](#二、 一维熵)
      • [1. 一维熵的定义](#1. 一维熵的定义)
      • [2. 一维熵的C++代码实现](#2. 一维熵的C++代码实现)
    • [三、 二维熵](#三、 二维熵)
      • [1. 二维熵的定义](#1. 二维熵的定义)
      • [2. 二维熵的C++代码实现](#2. 二维熵的C++代码实现)

一、 实验内容

B实验:使用VC++设计程序:对于一幅256级灰度图像,求其一元熵值、二维熵值

实验现象:

二、 一维熵

1. 一维熵的定义

一元灰度熵的定义:

  1. 概念: 图像熵是一种特征的统计形式,用于反映图像中平均信息量的多少。

  2. 一维熵: 表示图像中灰度分布的聚集特征所包含的信息量。

  3. 概率 (p_i): 用于描述某个灰度值 (i) 在图像中出现的概率,其取值范围是 (0 \leq p_i \leq 1)。这个概率可以通过灰度直方图获得。

  4. 一元灰度熵 (H_1): 通过以下公式定义:

H 1 = − ∑ i = 0 L − 1 p i ⋅ log ⁡ 2 ( p i ) H_1 = - \sum_{i=0}^{L-1} p_i \cdot \log_2(p_i) H1=−i=0∑L−1pi⋅log2(pi)

其中,(L) 是灰度级别的数量, p i p_i pi 是灰度值为 (i) 的像素在图像中出现的概率。

这个一元灰度熵的计算利用了香农熵的概念,衡量了图像中灰度分布的聚集特征所包含的信息量。高一元灰度熵通常表示图像的灰度分布较分散,低一元灰度熵表示图像的灰度分布较集中。

2. 一维熵的C++代码实现

c 复制代码
double entropy_1 = 0.0;  //一维熵
 double entropy_2 = 0.0;  //二维熵

 //获取图高
 int height = pDoc->m_pDibInit->GetHeight();
 //获取图宽
 int width = pDoc->m_pDibInit->GetWidth();

 int pixelGray[256] = { 0 };
 for(int i=0;i<height;i++)  //统计各灰度值的像素点的个数
  for (int j = 0; j < width; j++)
  {
   int grey = pDoc->m_pDibInit->GetPixelGray(i, j);
   pixelGray[grey]++; 
  }
 //将各灰度值个数转换成概率
 double PixGray[256] = { 0.0 };
 for (int i = 0; i < 256; i++)
 {
  PixGray[i] = (pixelGray[i]+0.0) / width /height;
  if (PixGray[i])
   entropy_1 += PixGray[i] * (log(PixGray[i]) / log(2));  //将log(e)转换成log(2)
 }
 entropy_1 = -entropy_1;

三、 二维熵

1. 二维熵的定义

图像的一维熵可以表示图像灰度分布的聚集特征,却不能反映图像灰度分布的空间特征,为了表征这种空间特征,可以在一维熵的基础上引入能够反映灰度分布空间特征的特征量来组成图像的二维熵。

选择图像的邻域灰度均值作为灰度分布的空间特征量,与图像的像素灰度组成特征二元组,记为(i, j),其中i表示像素的灰度值(0 ≤ i≤ 255),j表示邻域灰度均值(0≤j≤255):
P i j = f ( i , j ) / ( M ∗ N ) P_{ij}=f(i,j)/(M*N) Pij=f(i,j)/(M∗N)

上式能反应某像素位置上的灰度值与其周围像素灰度分布的

综合特征,其中f(i, j)为特征二元组(i, j)出现的频数,M、N分别为图像的宽度和高度,定义离散的图像二维熵为:
H = − ∑ i = 0 L − 1 ∑ j = 0 L − 1 p i ⋅ log ⁡ 2 ( p i ) H = - \sum_{i=0}^{L-1}\sum_{j=0}^{L-1} p_i \cdot \log_2(p_i) H=−i=0∑L−1j=0∑L−1pi⋅log2(pi)

其中,(L) 是灰度级别的数量, p i p_i pi 是灰度值为 (i) 的像素在图像中出现的概率。

构造的图像二维熵可以在图像所包含信息量的前提下,突出反映图像中像素位置的灰度信息和像素邻域内灰度分布的综合特征。

2. 二维熵的C++代码实现

c 复制代码
 //二维熵
 int val[256][256] = { 0 };  //存储每一个像素点的领域灰度均值

 for (int i = 0; i < height; i++)
 {
  for (int j = 0; j < width; j++)
  {
   int sum = 0; //记录领域灰度之和
   int num = 0; //统计领域取点的数量

   for (int k = -1; k <= 1; k++)
   {
    for (int m = -1; m <= 1; m++)
    {
     if (i + k >= 0 && i + k < 256 && j + m >= 0 && j + m < 255)
     {
      sum += pDoc->m_pDibInit->GetPixelGray(i + k, j + m);
      num++;
     }
    }
   }
   val[i][j] = sum / num;
  }
 }

 int F[256][256] = { 0 }; //统计f[i][j]的频数,i为该点灰度值,j为该点领域灰度均值
 float p_F[256][256] = { 0.0 }; //将频数转换成概率
 for(int i=0;i<height;i++)
  for (int j = 0; j < width; j++)
  {
   int gray = pDoc->m_pDibInit->GetPixelGray(i, j);
   F[gray][val[i][j]]++;
  }

 for (int k = 0; k < height; k++)
  for (int m = 0; m < width; m++)
  {
   p_F[k][m] = (F[k][m]+0.0) / height /width;
   if (p_F[k][m])
   {
    entropy_2 += p_F[k][m] * (log(p_F[k][m]) / log(2)); //将log(e)转换成log(2)
   }
  }
 entropy_2 = -entropy_2;
 CString str1;
 // 显示信息 
 str1.Format("图像一维熵:%f,图像二维熵:%f", entropy_1, entropy_2);
 MessageBox(str1);
 
相关推荐
敲代码的嘎仔9 分钟前
实习日志day6--实习日志day6--title命名规范化&businessType纠正&补充缺失的@Log注解&报警与通信模块补充&产出阶段总结文档
java·开发语言·人工智能·git·python·实习·大二
江华森27 分钟前
Python 实现高德地图找房(一):环境搭建与数据爬虫
开发语言·爬虫·python
杜子不疼.28 分钟前
【Qt初识】信号槽(三):机制意义、断开连接与 Lambda 表达式
开发语言·数据库·qt
老迟到的茉莉2 小时前
Hermes 是谁?跟 Claude Code 差在哪
开发语言·python
学逆向的2 小时前
汇编——内存
开发语言·汇编·算法·网络安全
lbb 小魔仙2 小时前
MuMu 模拟器 6.0 硬核测评:这次升级确实不一样
java·开发语言·模拟器·mumu·硬核测评
r_oo_ki_e_2 小时前
Java 线程池
java·开发语言
KuaCpp3 小时前
C++进程(下)
c++
杜子不疼.3 小时前
【Qt初识】信号槽(二):自定义信号函数与槽函数
开发语言·qt
ctrl_v助手3 小时前
C#日志工具类log4net的使用
开发语言·c#