欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

作业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;
	}

作业3:读入一个24bitRGB文件(以down.rgb为例,其分辨率为256*256),输出该数据文件中R、G、B三个分量(各8bit表示)的概率分布示意图和熵。
作业3:读入一个24bitRGB文件(以down.rgb为例,其分辨率为256*256),输出该数据文件中R、G、B三个分量(各8bit表示)的概率分布示意图和熵。
作业3:读入一个24bitRGB文件(以down.rgb为例,其分辨率为256*256),输出该数据文件中R、G、B三个分量(各8bit表示)的概率分布示意图和熵。
作业3:读入一个24bitRGB文件(以down.rgb为例,其分辨率为256*256),输出该数据文件中R、G、B三个分量(各8bit表示)的概率分布示意图和熵。
作业3:读入一个24bitRGB文件(以down.rgb为例,其分辨率为256*256),输出该数据文件中R、G、B三个分量(各8bit表示)的概率分布示意图和熵。
作业3:读入一个24bitRGB文件(以down.rgb为例,其分辨率为256*256),输出该数据文件中R、G、B三个分量(各8bit表示)的概率分布示意图和熵。作业3:读入一个24bitRGB文件(以down.rgb为例,其分辨率为256*256),输出该数据文件中R、G、B三个分量(各8bit表示)的概率分布示意图和熵。
本代码虽简洁但存在很大的局限性,如若改变读入的文件则需要重新修改代码,编程中使用的数组把代码写死了,如果rgb图像像素数改变则需修改数组长度。