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