2016-01-20 10 views
0

Я новичок, написавший сценарий для сжатия изображений с потерями с использованием Matlab.Сжатие изображения с использованием Haar Transform

Мой первый шаг состоял в том, чтобы полностью обрабатывать изображение, которое я делаю, используя следующий скрипт.

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) 

Теперь я хотел бы обратить этот процесс и получить исходное изображение с коэффициентами Хаара, установленных на 70%.

Любые указатели были бы замечательными.

ответ

1

Если вы применяете квантование с длиной интервала больше 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)) 

Затем инвертировать этап Хаара (как было в вашем коде)

AR(1:N,1:N) = T'*P'*B(1:N,1:N)*P'*T 

Обычно процесс Деквантование производится с центром интервала квантования (вместо одного из крайних значений, max в этом случае, так как вы использовали функцию ceil), поэтому вы можете использовать вместо этого несколько улучшенные результаты.

ln = q*lmaxt/127 - 0.5