使用 Haar 变换的图像压缩
Image Compression using Haar Transform
我是一个新手,正在使用 Matlab 编写有损图像压缩脚本。
我的第一步是对图像进行全面处理,我正在使用以下脚本进行处理。
clearvars all;
N = 256;
A=imread('test.jpg');
A=double(rgb2gray(A));
A=imresize(A,[N,N],'bicubic');
image(A);axis equal;colormap hsv;%gray(256) ;% display matrix as density plot
B = A;
while N>1
Q = [1 1;1 -1];
I = eye(N/2);
T = 1.414 * kron(I,Q);
II=eye(N)
I1= II(1:2:N,:);
I2=II(2:2:N,:);
P= [I1;I2];
%create transfer matrix N X N
B(1:N,1:N) = P*T*A(1:N,1:N)*T'*P';
%AR(1:N,1:N) = T'*P'*B(1:N,1:N)*P'*T
N = N/2;
end
imagesc(B);
drawnow;
此外,我想应用量化和对数阈值处理,并根据元素的绝对值递增对元素进行排序,同时保留前 5% 的元素。
以下脚本执行此操作:-
cutoff = 80;
% Decide what fraction of coeffs you want to set to % zero,
% this fraction is the variable ?cutoff?. .....
%(1);imagesc(A);colormap gray(256)
len = 7;
% Wavelet transform A -> B
X = sort(abs(B(:)));
thresh = X( ceil( cutoff*len^2));
maximum=X(len^2);
lmaxt= log2(maximum/thresh);
% Thresholding & Quantization
for i = 1:len
for j = 1:len
if(abs(B(i,j)) > thresh)
sign = B(i,j)/abs(B(i,j));
ln = log2(abs(B(i,j))/thresh);
q = ceil( 127*ln/lmaxt); Bq(i,j) = sign*q;
else
Bq(I,j) = 0;
end
end
end
figure;(2); spy(Bq)
现在,我想反转这个过程,得到 haar 系数设置为 70% 的原始图像。
任何指点都很好。
如果您应用间隔长度大于 1 的量化,则无法恢复原始图像。您能做的最好的事情就是以相反的顺序恢复该过程,并期望出现一些量化误差。
首先你恢复量化
% For all pixels (i,j) s.t. Bq(i,j) > 0
sign = Bq(i,j) / abs(Bq(i,j));
q = abs(q)
% To revert q = ceil(127*ln/lmaxt);
ln = q*lmaxt/127
B(i,j) = sign * thresh * pow(2, abs(ln))
然后你反转 haar 阶段(就像你在代码中所做的那样)
AR(1:N,1:N) = T'*P'*B(1:N,1:N)*P'*T
通常,反量化过程采用量化间隔的中心(而不是极端之一,在这种情况下是最大值,因为您使用了 ceil 函数),因此您可以使用它来获得更好的结果。
ln = q*lmaxt/127 - 0.5
我是一个新手,正在使用 Matlab 编写有损图像压缩脚本。
我的第一步是对图像进行全面处理,我正在使用以下脚本进行处理。
clearvars all;
N = 256;
A=imread('test.jpg');
A=double(rgb2gray(A));
A=imresize(A,[N,N],'bicubic');
image(A);axis equal;colormap hsv;%gray(256) ;% display matrix as density plot
B = A;
while N>1
Q = [1 1;1 -1];
I = eye(N/2);
T = 1.414 * kron(I,Q);
II=eye(N)
I1= II(1:2:N,:);
I2=II(2:2:N,:);
P= [I1;I2];
%create transfer matrix N X N
B(1:N,1:N) = P*T*A(1:N,1:N)*T'*P';
%AR(1:N,1:N) = T'*P'*B(1:N,1:N)*P'*T
N = N/2;
end
imagesc(B);
drawnow;
此外,我想应用量化和对数阈值处理,并根据元素的绝对值递增对元素进行排序,同时保留前 5% 的元素。
以下脚本执行此操作:-
cutoff = 80;
% Decide what fraction of coeffs you want to set to % zero,
% this fraction is the variable ?cutoff?. .....
%(1);imagesc(A);colormap gray(256)
len = 7;
% Wavelet transform A -> B
X = sort(abs(B(:)));
thresh = X( ceil( cutoff*len^2));
maximum=X(len^2);
lmaxt= log2(maximum/thresh);
% Thresholding & Quantization
for i = 1:len
for j = 1:len
if(abs(B(i,j)) > thresh)
sign = B(i,j)/abs(B(i,j));
ln = log2(abs(B(i,j))/thresh);
q = ceil( 127*ln/lmaxt); Bq(i,j) = sign*q;
else
Bq(I,j) = 0;
end
end
end
figure;(2); spy(Bq)
现在,我想反转这个过程,得到 haar 系数设置为 70% 的原始图像。
任何指点都很好。
如果您应用间隔长度大于 1 的量化,则无法恢复原始图像。您能做的最好的事情就是以相反的顺序恢复该过程,并期望出现一些量化误差。
首先你恢复量化
% For all pixels (i,j) s.t. Bq(i,j) > 0
sign = Bq(i,j) / abs(Bq(i,j));
q = abs(q)
% To revert q = ceil(127*ln/lmaxt);
ln = q*lmaxt/127
B(i,j) = sign * thresh * pow(2, abs(ln))
然后你反转 haar 阶段(就像你在代码中所做的那样)
AR(1:N,1:N) = T'*P'*B(1:N,1:N)*P'*T
通常,反量化过程采用量化间隔的中心(而不是极端之一,在这种情况下是最大值,因为您使用了 ceil 函数),因此您可以使用它来获得更好的结果。
ln = q*lmaxt/127 - 0.5