ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

读入RGB文件得到各分量的概率分布及熵

2020-03-13 10:03:06  阅读:263  来源: 互联网

标签:include Users Third 概率分布 Downloads Work RGB 读入 txt


在编写之前需要进行一些准备工作:

  • 需要有支持RGB文件读入的头文件
  • Xcode本身不支持对数运算,所以在求熵时需要添加cmath头文件
#include <iostream>
#include<cmath>
#include <fstream>

准备工作做好后,可以开始编写代码了:

#include <iostream>
#include<cmath>
#include <fstream>
#define Size 65536
using namespace std;
int main()
{
    //导入rgb文件并对txt存储文件命名
    ifstream iofile("/Users/yaohaoyuan/Downloads/The Third Work/down.rgb", ios::binary);
    ofstream outfileR("/Users/yaohaoyuan/Downloads/The Third Work/R.txt", ios::trunc);
    ofstream outfileG("/Users/yaohaoyuan/Downloads/The Third Work/G.txt", ios::trunc);
    ofstream outfileB("/Users/yaohaoyuan/Downloads/The Third Work/B.txt", ios::trunc);
    
    //输出txt文件抬头
    outfileR << "symbol\tfreq" << endl;
    outfileG << "symbol\tfreq" << endl;
    outfileB << "symbol\tfreq" << endl;
 
    if (!iofile)
    {
         cout << "File import failed!" << endl;
         exit(1);
    }
    
    //创建三个数组用于存储
    unsigned char R_i[Size];
    unsigned char G_i[Size];
    unsigned char B_i[Size];
    int R[256] = { 0 }, G[256] = { 0 }, B[256] = { 0 };
    
    
    //文件读取&复制
    for (int i = 0; i < Size; i++)
    {
         iofile.read((char*)&B_i[i], sizeof(unsigned char));
         B[int(B_i[i])]++;
         iofile.read((char*)&G_i[i], sizeof(unsigned char));
         G[int(G_i[i])]++;
         iofile.read((char*)&R_i[i], sizeof(unsigned char));
         R[int(R_i[i])]++;
     }

    
    //计算各分量的信源熵,信源熵计算公式:H(x)=E[I(xi)]=E[log2 1/p(xi)]=-ξp(xi)log2 p(xi)(i=1,2,..n)
    double  Entropy_G = 0,   Entropy_B = 0,   Entropy_R = 0;
    for (int i = 0; i < 256; i++)
    {
         double Probability_G = G[i] / Size;
         if (Probability_G != 0)
         {
             Entropy_G += Probability_G * log(1 / Probability_G) / log(2);
         }
         double Probability_B = B[i] / Size;
         if (Probability_B != 0)
         {
             Entropy_B += Probability_B * log(1 / Probability_B) / log(2);
         }
         double Probability_R = R[i] / Size;
         if (Probability_R != 0)
         {
             Entropy_R += Probability_R * log(1 / Probability_R) / log(2);
         }
    }
    
    
    //输出各分量的熵值
    cout << "Entropy_Red=" << Entropy_R << endl;
    cout << "Entropy_Green=" << Entropy_G << endl;
    cout << "Entropy_Blue=" << Entropy_B << endl;

    //利用outfile对象把希望输出到文件中的数据输出到txt中 
    for (int i = 0; i < 256; i++)
    {
         outfileR << i << "\t" << R[i] / Size << endl;
         outfileG << i << "\t" << G[i] / Size << endl;
         outfileB << i << "\t" << B[i] / Size << endl;
    }
    
    //输出完成后要关闭对象与文件之间的联接
    iofile.close();
    outfileR.close();
    outfileG.close();
    outfileB.close();
    cout << "Files created successfully!" << endl;
    return 0;
}

R,G,B的熵值如下:
在这里插入图片描述
将数据导入Excel,作表可得:
在这里插入图片描述
各熵值比较:
在这里插入图片描述

标签:include,Users,Third,概率分布,Downloads,Work,RGB,读入,txt
来源: https://blog.csdn.net/weixin_43165881/article/details/104834124

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有