📄 compression.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 + -