⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 compression.m

📁 本程序利用奇异值分解对3通道彩色图像进行压缩分解
💻 M
字号:
function [img0, average, vector] = compression(img, K)
%Syntax:[img, average, vector] = compression(img, K)
%IMG is the original image and K is the size of the subimage.
%IMG0 is the compressed image.
%AVERAGE is the average of all the subimages.
%VECTOR is a n*3 matrix,which is composed of the eigenvector of the max eigenvalue.

SIZE = size(img);
%check size of img
if size(SIZE,2) ~= 3 | SIZE(1) ~= SIZE(2)
    error('the first argument must be N*N*3 matrix.');
end
%check K
if K <= 0 | K ~= round(K)
    error('the second argument must be positive integer.');
end

m = SIZE(1) / K;

if m ~= round(m)
    error('bad input of the second argument.');
end
%show original image
figure;
imshow(img);
title('original image');

img1 = img(:,:,1);
img2 = img(:,:,2);
img3 = img(:,:,3);

average1 = zeros(K, K);
average2 = zeros(K, K);
average3 = zeros(K, K);

%if this bug can be solved, the efficiency of this program can been
%improved significantly.
% for i = 1:m
%     for j = 1:m
%         average(1:K, 1:K) = average(1:K, 1:K) + img(((i-1)*K+1):(i*K), ((j-1)*K+1):(j*K));
%     end
% end

%compute the average image
for i = 1:K
    for j = 1:K
        for p = 1:m
            for q = 1:m
                average1(i, j) = average1(i, j) + img1(i+K*(p-1), j+K*(q-1));
                average2(i, j) = average2(i, j) + img2(i+K*(p-1), j+K*(q-1));
                average3(i, j) = average3(i, j) + img3(i+K*(p-1), j+K*(q-1));
            end
        end
    end
end

average1 = average1/(m*m);
average2 = average2/(m*m);
average3 = average3/(m*m);

for i = 1:K
    for j = 1:K
        for p = 1:m
            for q = 1:m
                img1(i+K*(p-1), j+K*(q-1)) = img1(i+K*(p-1), j+K*(q-1)) - average1(i, j);
                img2(i+K*(p-1), j+K*(q-1)) = img2(i+K*(p-1), j+K*(q-1)) - average2(i, j);
                img3(i+K*(p-1), j+K*(q-1)) = img3(i+K*(p-1), j+K*(q-1)) - average3(i, j);
            end
        end
    end
end

R1 = zeros(K.^2, K.^2);
R2 = zeros(K.^2, K.^2);
R3 = zeros(K.^2, K.^2);
%compute R1,R2,R3
for i = 1:K
    for j = 1:K
        for k = 1:K
            for l = 1:K
                for p = 1:m
                    for q = 1:m
                        R1(i+K*(j-1), k+K*(l-1)) = img1(i+K*(p-1), j+K*(q-1)) * img1(k+K*(p-1), l+K*(q-1));
                        R2(i+K*(j-1), k+K*(l-1)) = img2(i+K*(p-1), j+K*(q-1)) * img2(k+K*(p-1), l+K*(q-1));
                        R3(i+K*(j-1), k+K*(l-1)) = img3(i+K*(p-1), j+K*(q-1)) * img3(k+K*(p-1), l+K*(q-1));
                    end
                end
            end
        end
    end
end
%compute the eigenvalues and eigenvectors of R1,R2,R3
[V1, D1] = eig(R1);
[V2, D2] = eig(R2);
[V3, D3] = eig(R3);

max1 = D1(1, 1);
max2 = D2(1, 1);
max3 = D3(1, 1);

num1 = 1;
num2 = 1;
num3 = 1;
%sort the eigenvalues and choose maximun
for i = 2:K.^2;
    if max1 < D1(i, i)
        max1 = D1(i, i);
        num1 = i;
    end
end

for i = 2:K.^2;
    if max2 < D2(i, i)
        max2 = D2(i, i);
        num2 = i;
    end
end

for i = 2:K.^2;
    if max3 < D3(i, i)
        max3 = D3(i, i);
        num3 = i;
    end
end
%choose the vector relative the max eigenvalue
vector1 = V1(1:K.^2, num1);
vector2 = V2(1:K.^2, num2);
vector3 = V3(1:K.^2, num3);

temp1 = reshape(vector1, K, K);
temp2 = reshape(vector2, K, K);
temp3 = reshape(vector3, K, K);
%compute the compressed image
for i = 1:K
    for j = 1:K
        for p = 1:m
            for q = 1:m
                img1(i+K*(p-1), j+K*(q-1)) = img1(i+K*(p-1), j+K*(q-1)) .* temp1(i, j);
                img2(i+K*(p-1), j+K*(q-1)) = img2(i+K*(p-1), j+K*(q-1)) .* temp2(i, j);
                img3(i+K*(p-1), j+K*(q-1)) = img3(i+K*(p-1), j+K*(q-1)) .* temp3(i, j);
            end
        end
    end
end
%create img0
img0(:, :, 1) = img1;
img0(:, :, 2) = img2;
img0(:, :, 3) = img3;
%create average
average(:, :, 1) = average1;
average(:, :, 2) = average2;
average(:, :, 3) = average3;
%creat vector
vector(:, 1) = vector1;
vector(:, 2) = vector2;
vector(:, 3) = vector3;
%show compressed image
figure;
imshow(img0);
title('compressed image');
        

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -