📄
字号:
#include<iostream>
#include<fstream>
#include<math.h>
using namespace std;
struct rnode
{
int data;//灰度值
int num;//相同灰度值的点的个数
};
rnode r[400];
int s[100][100];
int k=1;
void read(int v,int w)
{
ifstream in("游程编码.txt");
for(int i=1;i<=v;i++)
{
for(int j=1;j<=w;j++)
{
in>>s[i][j];
cout<<s[i][j]<<" ";
}
cout<<endl;
}
}
void RLE(int v,int w)
{
for(int i=1;i<=v;i++)//将每一行相同的元素进行统计,存放在r[k]中
{
int a=1;
for(int j=1;j<=w;j++)
{
if(s[i][j]==s[i][j+1])
a++;
else
{
r[k].data=s[i][j];
r[k].num=a;
k++;
a=1;
}
}
}
}
void change(int x,int len)//将十进制的数x转换成为二进制,二进制数的长度为len
{
int binary[11];
for(int i=0;i<=10;i++)
binary[i]=0;
int j=len;
while(x!=0)
{
int y=x/2;
binary[j]=x-2*y;
j--;
x=y;
}
for(int m=1;m<=len;m++)
cout<<binary[m];
}
void main()
{
cout<<"游程编码"<<endl;
cout<<"输入行数v=";
int v;
cin>>v;
cout<<"输入列数w=";
int w;
cin>>w;
cout<<"输入灰度值z=";
int z;
cin>>z;
int w1;//对游程进行编码时的码的长度
int z1;//对灰度进行编码时的码的长度
w1=log10(w)/log10(2)+1;
z1=log10(z-1)/log10(2)+1;
read(v,w);
RLE(v,w);
for(int b=1;b<k;b++)//k为r数组中的元素个数
{
cout<<"("<<r[b].data<<","<<r[b].num<<")";
}
cout<<endl;
for(int c=1;c<k;c++)
{
change(r[c].data,z1);
change(r[c].num-1,w1);
}
cout<<" ";
change(z1,log10(z1)/log10(2)+1);
cout<<" ";
change(w1,log10(w1)/log10(2)+1);
cout<<endl;
int total1=(k-1)*(w1+z1);
int total2=w*v*z1;
double p=(double)total2/total1;
cout<<"编码效率为:"<<p<<endl;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -