【数据压缩(一)】c语言计算图像YUV分量的熵

#include<stdio.h>
#include<iostream>
#include<math.h>
using namespace std;

int Height = 256;
int Width = 256;

int main()
{
    unsigned char R[65536] = { 0 };
    unsigned char G[65536] = { 0 };
    unsigned char B[65536] = { 0 };
    //R、G、B分量

    double fre_R[256] = { 0 };
    double fre_G[256] = { 0 };
    double fre_B[256] = { 0 };
    //计算频率

    double entropy_R = 0;
    double entropy_G = 0;
    double entropy_B = 0;
    //计算分量的熵

    FILE* Image;
    fopen_s(&Image, "C:/Users/86137/Desktop/数据压缩/test/test.rgb", "rb");
    //打开rgb文件

    FILE* Red;
    FILE* Green;
    FILE* Blue;
    fopen_s(&Red, "C:/Users/86137/Desktop/数据压缩/test/Red.txt", "w");
    fopen_s(&Green, "C:/Users/86137/Desktop/数据压缩/test/Green.txt", "w");
    fopen_s(&Blue, "C:/Users/86137/Desktop/数据压缩/test/Blue.txt", "w");
    //创建新的txt文件    

    unsigned char buffer[196608];
    fread(buffer, 1, 196607, Image);

    for (int i = 0, j = 0; i < 196608; i = i + 3, j++)
    {
        B[j] = *(buffer + i);
        G[j] = *(buffer + i + 1);
        R[j] = *(buffer + i + 2);
        //分别读取R、G、B三个分量到数组中
    }

    for (int i = 0; i < 256; i++)
    {
        for (int j = 0; j < 65536; j++)
        {
            if (int(R[j] == i))
            {
                fre_R[i]++;
            }
        }
    }

    for (int i = 0; i < 256; i++)
    {
        for (int j = 0; j < 65536; j++)
        {
            if (int(G[j] == i))
            {
                fre_G[i]++;
            }
        }
    }

    for (int i = 0; i < 256; i++)
    {
        for (int j = 0; j < 65536; j++)
        {
            if (int(B[j] == i))
            {
                fre_B[i]++;
            }
        }
    }
    for (int i = 0; i < 256; i++)
    {
        fre_R[i] = fre_R[i] / double(Height * Width);
        fre_B[i] = fre_B[i] / double(Height * Width);
        fre_G[i] = fre_G[i] / double(Height * Width);
    }

    for (int i = 0; i < 256; i++)
    {
        if (fre_R[i] != 0)
        {
            entropy_R += -fre_R[i] * log(fre_R[i]) / log(2);
        }
    }
    for (int i = 0; i < 256; i++)
    {
        if (fre_G[i] != 0)
        {
            entropy_G += -fre_G[i] * log(fre_G[i]) / log(2);
        }
    }
    for (int i = 0; i < 256; i++)
    {
        if (fre_B[i] != 0)
        {
            entropy_B += -fre_B[i] * log(fre_B[i]) / log(2);
        }
    }
    cout << "R的熵为" << entropy_R << endl;
    cout << "G的熵为" << entropy_G << endl;
    cout << "B的熵为" << entropy_B << endl;
    //分别计算R、G、B的频率和熵

    //写入文件
    fprintf(Red, "数值\t概率\n");
    for (int i = 0; i < 256; i++)
    {
        fprintf(Red, "%d\t%f\n", i, fre_R[i]);
    }

    fprintf(Green, "数值\t概率\n");
    for (int i = 0; i < 256; i++)
    {
        fprintf(Green, "%d\t%f\n", i, fre_G[i]);
    }

    fprintf(Blue, "数值\t概率\n");
    for (int i = 0; i < 256; i++)
    {
        fprintf(Blue, "%d\t%f\n", i, fre_B[i]);
    }

    fclose(Image);
    fclose(Red);
    fclose(Green);
    fclose(Blue);
    return 0;
}

实验结果:

 

 

参考:读取RGB及YUV格式图片并计算各自熵_adelaide_go的博客-CSDN博客

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值