第三次作业
#include<stdio.h>
#include<iostream>
#include<math.h>
using namespace std;
int w = 256;
int h = 256;
unsigned char r[65535];
unsigned char g[65535];
unsigned char b[65535];
double Pr[256] = { 0 };
double Pg[256] = { 0 };
double Pb[256] = { 0 };
double Hr=0, Hg=0, Hb=0;
int main()
{
FILE* photo = fopen("D:\\down.rgb ","rb+");
FILE* Red = fopen("D:\\Red.txt", "w");
FILE* Green = fopen("D:\\Green.txt", "w");
FILE* Blue = fopen("D:\\Blue.txt", "w");
unsigned char a[196608];
fread(a, sizeof(unsigned char), 196608, photo);//将图片读取至一个大数组
for (int i = 0, j = 0; i < 196608; i = i + 3, j++)//将大数组分为BGR三个小数组
{
b[j] = a[i];
g[j] = a[i + 1];
r[j] = a[i + 2];
}
for (int i = 0; i < 256; i++)//利用for循环扫描所有红色像素,将0到255的值各有多少进行计数
{
for (int j = 0; j < 65536; j++)
{
if (int(r[j]) == i) { Pr[i]++; }
}
}
for (int i = 0; i < 256; i++)
{
for (int j = 0; j < 65536; j++)
{
if (int(g[j]) == i) { Pg[i]++; }
}
}
for (int i = 0; i < 256; i++)
{
for (int j = 0; j < 65536; j++)
{
if (int(b[j]) == i) { Pb[i]++; }
}
}
for (int i = 0; i < 256; i++)
{
Pr[i] = Pr[i] / 65536;//红色概率等于频次除总像素数
Pg[i] = Pg[i] / 65536;
Pb[i] = Pb[i] / 65536;
}
for (int i = 0; i < 256; i++)//计算红色的熵
{
if (Pr[i] != 0)
{
Hr += Pr[i] * (log(1 / Pr[i]) / log(2));
}
}
cout << "红色的熵为" << Hr << endl;
for (int i = 0; i < 256; i++)
{
if (Pg[i] != 0)
{
Hg += Pg[i] * (log(1 / Pg[i]) / log(2));
}
}
cout << "绿色的熵为" << Hg << endl;
for (int i = 0; i < 256; i++)
{
if (Pb[i] != 0)
{
Hb += Pb[i] * (log(1 / Pb[i]) / log(2));
}
}
cout << "蓝色的熵为" << Hb << endl;
fprintf(Red, "值\t概率\n");
for (int i = 0; i < 256; i++)
{
fprintf(Red, "%d\t%f\n", i, Pr[i]);
}
fprintf(Green, "值\t概率\n");
for (int i = 0; i < 256; i++)
{
fprintf(Green, "%d\t%f\n", i, Pg[i]);
}
fprintf(Blue, "值\t概率\n");
for (int i = 0; i < 256; i++)
{
fprintf(Blue, "%d\t%f\n", i, Pb[i]);
}
fclose(Red);
fclose(Green);
fclose(Blue);
system("pause");
}
运行结果