多媒体有关实验内容

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

I=imread('p12.bmp')%读取图像
I1=im2double(I);%图像存储类型转换
T=dctmtx(8);%离散余弦变换矩阵
B=blkproc(I1,[8 8],'P1*x*P2',T,T');%对源图像进行DCT变换
mask=[1 1 1 1 0 0 0 0
1 1 1 0 0 0 0 0
1 1 0 0 0 0 0 0
1 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0]
B2=blkproc(B,[8 8],'P1*x',mask);%数据压缩,丢弃右下角高频数据
I2=blkproc(B2,[8 8],'P1*x*P2',T',T);%进行DCT反变换
subplot(121),imshow(I1)%显示原始图像
subplot(122),imshow(I2)%显示压缩后的图像




Sig=imread('p12.tif');%读取图像
rat=4;%设置压缩比
Sig=double(Sig)/255;%设置系数保留个数
figure(1);
imshow (Sig);%显示原图像
T=dctmtx (8);%计算离散余弦变换
B=blkproc(Sig, [8 8],'P1*x*P2',T,T'); %分块处理
coeVar=im2col(B,[8 8], 'distinct');%得到DCT系数矩阵
coe=coeVar;
[Y ,Ind ]= sort(coeVar) ;
[m ,n]= size(coeVar) ;%求出DCT系数矩阵大小
Snum = 64-64 *rat;
For I= 1: n %按照压缩比保留系数
Coe (Ind(1:Snum ),I)=0;
End
B2=col2im (coe,[8 8 ],[256 256 ],'distinct') ;%重新排列系数快
I2=blkproc(B2, [8 8],'P1*x*P2',T',T);%进行余弦反变换
figure(4);
imshow(I2);
error=Sig,2-I2,2;
MSE=sum(error(:))/prod(size(I2));







clear all;
K=imread('p12.bmp');
m1=128;
n1=128;
c1=1;
for i=1:m1
for j=1:n1
I(c1)=K(i,j);
c1=c1+1;
end
end
len=length(I);
t=2;
biaozhi=0;
b(1)=I(1);
for i=2:len
for j=1:i-1
if I(j)==I(i)
biaozhi=1;
break;
end
end
if biaozhi==0
b(t)=I(i);
t=t+1;
end
biaozhi=0;
end
fprintf('信源总长度:\n');
disp(len); %信源总长度
fprintf('字符:\n');
disp(b );
L=length(b);
for i=1:L
a=0;
for j=1:len
if b(i)==I(j)
a=a+1;
count(i)=a;
end
end
end
count=count/len;%各字符概率
fprintf('各字符概率:\n');
disp(count);
p=count;
%%%%%%%%%%%%%%%%%%%%%%%%%%%
s=0;
l=0;
H=0;
N=length(p);
for i=1:N
H=H+(- p(i)*log2(p(i)));%计算信源信息熵
end
fprintf('信源信息熵:\n');
disp(H);
tic;
for i=1:N-1 %按概率分布大小对信源排序
for j=i+1:N
if p(i)m=p(j);
p(j)=p(i);
p(i)=m;
end
end
end
Q=p;
m=zeros(N-1,N);
for i=1:N-1 %循环缩减对概率值排序,画出由每个信源符号概率到1.0 处的路径,
[Q,l]=sort(Q);
m(i,:)=[l(1:N-i+1),zeros(1,i-1)];
Q=[Q(1)+Q(2),Q(3:N),1];
end
for i=1:N-1
c(i,:)=blanks(N*N);
end
c(N-1,N)='0';
c(N-1,2*N)='1';
for i=2:N-1 %对字符数组c码字赋值过程,记下沿路径的“1”和“0”;
c(N-i,1:N-1)=c(N-i+1,N*(find(m(N-i+1,:)==1))-(N-2):N*(find(m(N-i+1,:)==1)));
c(N-i,N)='0';
c(N-i,N+1:2*N-1)=c(N-i,1:N-1);
c(N-i,2*N)='1';
for j=1:i-1
c(

N-i,(j+1)*N+1:(j+2)*N)=c(N-i+1,N*(find(m(N-i+1,:)==j+1)-1)+1:N*find(m(N-i+1,:)==j+1));
end
end
for i=1:N
h(i,1:N)=c(1,N*(find(m(1,:)==i)-1)+1:find(m(1,:)==i)*N);%码字赋值
ll(i)=length(find(abs(h(i,:))~=32)); %各码字码长
end
l=sum(p.*ll); %计算平均码长
n=H/l; %计算编码效率
fprintf('编码的码字:\n');
disp(h) %按照输入顺序排列的码字
fprintf('平均码长:\n');
disp(l) %输出平均码长
fprintf('编码效率:\n');
disp(n) %输出编码效率
fprintf('计算耗时time= %f\n',toc);



Sig=imread('p12.tif');%读取图像
rat=4;%设置压缩比
Sig=double(Sig)/255;%设置系数保留个数
figure(1);
imshow (Sig);%显示原图像
T=dctmtx (8);%计算离散余弦变换
B=blkproc(Sig, [8 8],'P1*x*P2',T,T'); %分块处理
coeVar=im2col(B,[8 8], 'distinct');%得到DCT系数矩阵
coe=coeVar;
[Y ,Ind ]= sort(coeVar) ;
[m ,n]= size(coeVar) ;%求出DCT系数矩阵大小
Snum = 64-64 *rat;
For I= 1: n
Coe (Ind(1:Snum ),I)=0;
End
B2=col2im (coe,[8 8 ],[256 256 ],'distinct') ;%重新排列系数快
I2=blkproc(B2, [8 8],'P1*x*P2',T',T);%进行余弦反变换
figure(4);
imshow(I2);



#include
#include
#include
#include
#include
#include
#define PI 3.1415926
int M,N;
void DCT(double *f,double *F)
{ int n,m,x;
double *dTemp=new double[M*N];//中间矩阵
double *coff=new double[M*N];//变换系数
coff[0]=(double)1/sqrt((double)N);
for(m=1; mcoff[m]=sqrt((double)2)/sqrt((double)N);
memset(dTemp,0,sizeof(double)*M*N);
memset(F,0,sizeof(double)*M*N);//一维变换
for(n=0; nfor(m=0; mfor(x=0; xdTemp[m*N+n]+=coff[m]*f[x*N+n]*cos((2*x+1)*PI*m/(2*N));//第二次一维变换
for(m=0; mfor(n=0; nfor(x=0; xF[m*N+n]+=coff[n]*dTemp[m*N+x]*cos((2*x+1)*PI*n/(2*N));
delete []dTemp;
delete []coff;}
int main()
{ char strFile[255];
cout<<"please input the .bmp file name:"<cin>>strFile;
ifstream infile(strFile,ios::binary);
ofstream outfile(strcat(strFile,".TXT"),ios::out);
BITMAPFILEHEADER bitHead;
infile.read((char*)&bitHead,sizeof(BITMAPFILEHEADER));
cout<outfile<cout<outfile<cout<outfile<cout<outfile<cout<outfile<BITMAPINFOHEADER bitInfoHead

;
infile.read((char*)&bitInfoHead,sizeof(BITMAPINFOHEADER));
cout<outfile<cout<outfile<cout<outfile<cout<outfile<cout<outfile<cout<outfile<cout<outfile<cout<outfile<cout<outfile<cout<outfile<cout<outfile<<"biClrImportant:"<RGBQUAD *pColorTable;
if (bitInfoHead.biBitCount==1){
pColorTable=new RGBQUAD[2];
for (int i=0;i<2;i++){
infile.read((char*)&pColorTable[i],sizeof(RGBQUAD));
cout<<"R:"<outfile<<"R:"<}
}else if (bitInfoHead.biBitCount==4){
pColorTable=new RGBQUAD[16];
for (int i=0;i<16;i++){
infile.read((char*)&pColorTable[i],sizeof(RGBQUAD));
cout<<"R:"<outfile<<"R:"<}else if (bitInfoHead.biBitCount==8){
pColorTable=new RGBQUAD[256];
for (int i=0;i<256;i++){
infile.read((char*)&pColorTable[i],sizeof(RGBQUAD));
cout<<"R:"<outfile<<"R:"<

ue)<if (bitInfoHead.biBitCount==24){}else{
M=bitInfoHead.biWidth;
N=bitInfoHead.biHeight;
double *f=new double[M*N];
double *F=new double[M*N];
memset(F,0,sizeof(double)*M*N);
int lineByte=(bitInfoHead.biWidth * bitInfoHead.biBitCount/8+3)/4*4;
unsigned char *pBmpBuf;
int bmpSize=lineByte * bitInfoHead.biHeight;
pBmpBuf=new unsigned char[bmpSize];
for (int i=0;iinfile.read(&pBmpBuf[i],1);
cout<outfile<f[i]=double(pBmpBuf[i]);
if((i+1)%bitInfoHead.biWidth==0){cout<long L;
cout<<"循环次数:"<cin>>L;
for(i=0; iDCT(f,F);
cout<<"变换后:"<for(i=1; i<=M*N; i++) {
cout<outfile<if(i%M==0){cout<delete []f;
delete []F;}
outfile.close();
infile.close();
return 0;}

相关文档
最新文档