Сжатие изображений с использованием преобразования Хаара

Я новичок, пишу скрипт для сжатия изображений с потерями с использованием 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)

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

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


person Abhishek    schedule 20.01.2016    source источник


Ответы (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

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

ln = q*lmaxt/127 - 0.5
person mhernandez    schedule 21.01.2016