www.gusucode.com > 对bmp文件进行Vector Quantization 运行其中的VQ_GUI.m文件 > VQcoding/vqcode1.m
function [AA,etime1,etime2,PSNR]=vqcode1(A) tic A=double(A); A1=A(:,:,1); A2=A(:,:,2); A3=A(:,:,3); [longA,wideA]=size(A1); ll=longA*wideA; A1=reshape(A1',1,ll);%将R,G,B的矩阵转化成一唯序列 A2=reshape(A2',1,ll); A3=reshape(A3',1,ll); length_code=256;%码本长度 codebook=[A1(1),A2(1),A3(1)]; %码本初始化 % codebook(:,1)=A1(1:length_code)'; % codebook(:,2)=A2(1:length_code)'; % codebook(:,3)=A3(1:length_code)';%取该序列中前length_code个像素作为初始码本 k=2; interval=round(ll/500); iii=2; while k<=256 equ=0; temp=[A1(iii),A2(iii),A3(iii)]; for i=1:k-1 temp1=codebook(i,1:3)-temp; if sum(temp1)~=0 equ=equ+1; else equ=0; end end if equ~=k-1 iii=iii+interval;%隔interval个加一组入码本 else codebook(k,1:3)=temp; iii=iii+interval; k=k+1; end end codebook(:,4)=ones(length_code,1); codebook1=codebook; for q=1:2 %更新码本的次数q,为了减少运算时间,定为2 N=ll;%循环次数控制,由象素点的个数决定 for i=0:N-1 place=1+mod(i,longA*wideA); RGB=[A1(place),A2(place),A3(place)];%此时参与循环的颜色值 RGB=double(RGB); position_codebook=fmin_codebook(RGB,codebook1,length_code);%找出与该像素点空间距离最近的码本元素 %修改码本 codebook(position_codebook,1:3)=(RGB+codebook(position_codebook,4)*codebook(position_codebook,1:3))/(codebook(position_codebook,4)+1); codebook(position_codebook,4)=codebook(position_codebook,4)+1; end codebook1=codebook; end etime1=toc tic AA1=A1; AA2=A2; AA3=A3; noise=0; for i2=1:ll temp=[A1(i2),A2(i2),A3(i2)]; position_codebook=fmin_codebook(temp,codebook,length_code); noise=noise+sqrt((temp-codebook(position_codebook,1:3))*(temp-codebook(position_codebook,1:3))'); AA1(i2)=codebook(position_codebook,1); AA2(i2)=codebook(position_codebook,2); AA3(i2)=codebook(position_codebook,3); end MSE=noise/ll; PSNR=10*log10((2^8-1)^2/MSE); AA1=reshape(AA1,wideA,longA)'; AA2=reshape(AA2,wideA,longA)'; AA3=reshape(AA3,wideA,longA)'; AA(:,:,1)=AA1; AA(:,:,2)=AA2; AA(:,:,3)=AA3; AA=uint8(AA); A=uint8(A); etime2=toc