作业3:读入一个24bitRGB文件(以down.rgb为例,其分辨率为256*256),输出该数据文件中R、G、B三个分量(各8bit表示)的概率分布示意图和熵。
程序员文章站
2022-07-14 22:19:48
...
提示:(用C或C++实现时),程序的流程为
开辟3个width*height的unsigned char型数组;打开要读出的RGB文件(以“rb”方式打开),打开3个要输出的数据统计文件(以“w”方式打开,可命名为R_sat.txt等);将RGB数据从RGB文件中读出,并分别保存到3个数组中,期间计算数据的概率分布和熵,并将这些数据写入3个数据统计txt文件中。Txt文件的写入方式如下所示(每行的两个数据用tab分开)。在Excel里将这3个txt文件打开即可生成统计图。
代码如下:
#include<stdio.h>
#include<iostream>
#include<math.h>
#include <stdlib.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};
FILE *fdown;
fdown=fopen( "D:\\大三下\\数据压缩\\down.rgb", "rb");
//读入数组
unsigned char pix[196608];
fread(pix, 1,196608, fdown);
for(int i=0,j=0;i<Width*Height*3;i=i+3)
{
R[j]=pix[i+2];
G[j]=pix[i+1];
B[j]=pix[i];
j++;
}
//计算频率
double fre_R[256]={0};
double fre_G[256]={0};
double fre_B[256]={0};
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] / int(Height*Width);
fre_B [i]= fre_B[i] / int(Height*Width);
fre_G [i] = fre_G[i] / int(Height*Width);
}
//计算熵
double entropy_R = 0;
double entropy_G = 0;
double entropy_B = 0;
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;
//写入文件
FILE* Red;
FILE* Green;
FILE* Blue;
Red=fopen("D:\\大三下\\数据压缩\\R_sat.txt", "w");
Green=fopen("D:\\大三下\\数据压缩\\G_sat.txt", "w");
Blue=fopen("D:\\大三下\\数据压缩\\B_sat.txt", "w");
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(fdown);
fclose(Red);
fclose(Green);
fclose(Blue);
system("pause");
return 0;
}
本代码虽简洁但存在很大的局限性,如若改变读入的文件则需要重新修改代码,编程中使用的数组把代码写死了,如果rgb图像像素数改变则需修改数组长度。
推荐阅读
-
作业3:读入一个24bitRGB文件(以down.rgb为例,其分辨率为256*256),输出该数据文件中R、G、B三个分量(各8bit表示)的概率分布示意图和熵。
-
作业3:读入一个24bitRGB文件,输出该数据文件中R、G、B三个分量的概率分布示意图和熵。
-
2020.3.9读入一个24bitRGB文件(以down.rgb为例,其分辨率为256*256),输出该数据文件中R、G、B三个分量(各8bit表示)的概率分布示意图(类似下图)和熵。
-
作业3:读入一个24bitRGB文件(以down.rgb为例,其分辨率为256*256),输出该数据文件中R、G、B三个分量(各8bit表示)的概率分布示意图(类似下图)和熵。