对RGB和YUV文件各通道进行概率密度分析,并计算信息熵

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


一、作业题目

对down.rgb和down.yuv文件分析,分辨率均为256*256,YUV为4:2:0,rgb文件按照每个像素BGR分量依次存放,YUV按照全部像素的Y数据块、U数据块、V数据块依次存放。

二、解决思路

将RGB/YUV数据计入到一个数组中,读取各个分量频数,除以256*256得到频率,根据熵的公式计算出信息熵。

在这里插入图片描述

1. 具体实现

代码如下:

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

int main()
{
    FILE* fp1, * fp2;
    double Hy = 0.0, Hu = 0.0, Hv = 0.0, Hr = 0.0, Hg = 0.0, Hb = 0.0;
    unsigned char* buffer0 = new unsigned char[256 * 256 * 1.5];
    unsigned char* buffer1 = new unsigned char[256 * 256 * 3];
    double buffer0y[256]{}, buffer0u[256]{}, buffer0v[256]{}, buffer1r[256]{}, buffer1g[256]{}, buffer1b[256]{};
    fopen_s(&fp1, "down.yuv", "rb");
    fopen_s(&fp2, "down.rgb", "rb");

    fread(buffer0, sizeof(unsigned char), 256 * 256 * 1.5, fp1);//将文件YUV数据存放到buffer0中
    for (int i = 0; i < (256 * 256); i++)//yuv分量按照全部像素的Y数据块、U数据块、V数据块依次存放
    {
        buffer0y[buffer0[i]]++;//频数加一
    }
    for (int j = 0;j < 256;j++)
    {
        buffer0y[j] = buffer0y[j] / (256 * 256);//y分量频率
        if (buffer0y[j] != 0)
        {
            Hy = Hy + buffer0y[j] * log2(1 / buffer0y[j]);//Y通道熵
        }
    }
    for (int i = (256 * 256); i < (256 * 256 * 1.25); i++)
    {
        buffer0u[buffer0[i]]++;
        buffer0v[buffer0[i + 16384]]++;
    }
    for (int j = 0;j < 256;j++)
    {
        buffer0u[j] = buffer0u[j] / (256 * 256 * 0.25);
        if (buffer0u[j] != 0)
        {
            Hu = Hu + buffer0u[j] * log2(1 / buffer0u[j]);
        }
        buffer0v[j] = buffer0v[j] / (256 * 256 * 0.25);
        if (buffer0v[j] != 0)
        {
            Hv = Hv + buffer0v[j] * log2(1 / buffer0v[j]);
        }
    }
    fread(buffer1, sizeof(unsigned char), 256 * 256 * 3, fp2);//将rgb数据存放到buffer1中
    for (int i = 0; i < (256 * 256); i++)
    {//bgr分量依次存放
        buffer1r[buffer1[i * 3]]++;
        buffer1g[buffer1[i * 3 + 1]]++;
        buffer1b[buffer1[i * 3 + 2]]++;
    }
    for (int j = 0;j < 256;j++)
    {
        buffer1r[j] = buffer1r[j] / (256 * 256);
        if (buffer1r[j] != 0)
        {
            Hr = Hr + buffer1r[j] * log2(1 / buffer1r[j]);
        }
        buffer1g[j] = buffer1g[j] / (256 * 256);
        if (buffer1g[j] != 0)
        {
            Hg = Hg + buffer1g[j] * log2(1 / buffer1g[j]);
        }
        buffer1b[j] = buffer1b[j] / (256 * 256);
        if (buffer1b[j] != 0)
        {
            Hb = Hb + buffer1b[j] * log2(1 / buffer1b[j]);
        }
    }
    fclose(fp1);
    fclose(fp2);
    cout << "R通道的熵为" << Hr << endl;
    cout << "G通道的熵为" << Hg << endl;
    cout << "B通道的熵为" << Hb << endl;
    cout << "Y通道的熵为" << Hy << endl;
    cout << "U通道的熵为" << Hu << endl;
    cout << "V通道的熵为" << Hv << endl;
    return (0);
}

2.结果

在这里插入图片描述

H(x)计算值
Hr6.86
Hg7.18
Hb7.22
Hy6.33
Hu5.12
Hv4.11

三、总结归纳

1)对图片格式的知识要熟练才能思路清晰(就是不清晰导致时间花费太多),对信息熵的计算知识不能丢。
2)编写程序可以参照上学期数字视音频处理课程中对文件的读写等技。
3)csdn发表博客流程不太熟悉,力求做出更好的版面。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值