Сжатие JPEG с примером в DIP и его реализация в MATLAB || Сжатие с потерями ||
Автор: Study with Dr. Dafda
Загружено: 2022-10-09
Просмотров: 8702
Серия видеолекций по цифровой обработке изображений, лекция: 46,
Сжатие JPEG на примере DIP и его реализация в MATLAB
Каковы этапы сжатия JPEG?
Как осуществляется выбор преобразования?
Что такое базисные функции в обработке изображений?
Как выглядит блок-схема кодера и декодера JPEG?
Почему DCT используется для сжатия изображений JPEG?
Ссылка для скачивания презентаций/конспектов лекций:
https://drive.google.com/drive/folder...
Коды MATLAB, использованные в видео, приведены ниже.
#DIP
#DIPwithMATLAB
#DigitalImageProcessingUsingMATLAB
#DigitalImageProcessing
#StudywithDrDafda
Код MATLAB, использованный в видео:
% Программа MATLAB для сжатия изображений в оттенках серого в формате JPEG
clc;
закрыть всё;
сбросить всё;
I = imread('cameraman.tif');
I1=I;
[row coln]= size(I);
I= double(I);
I = I - (128*ones(256));
% Высокое качество здесь означает низкое сжатие
quality = input('Какое качество сжатия вам требуется - ');
Q50 = [ 16 11 10 16 24 40 51 61;
12 12 14 19 26 58 60 55;
14 13 16 24 40 57 69 56;
14 17 22 29 51 87 80 62;
18 22 37 56 68 109 103 77;
24 35 55 64 81 104 113 92;
49 64 78 87 103 121 120 101;
72 92 95 98 112 100 103 99];
если качество {больше} 50
QX = round(Q50.*(ones(8)*((100-качество)/50)));
QX = uint8(QX);
elseif качество {меньше} 50
QX = round(Q50.*(ones(8)*(50/качество)));
QX = uint8(QX);
elseif качество == 50
QX = Q50;
end
DCT_matrix8 = dct(eye(8));
iDCT_matrix8 = DCT_matrix8'; %inv(DCT_matrix8);
dct_restored = zeros(row,coln);
QX = double(QX);
for i1=[1:8:row]
for i2=[1:8:coln]
zBLOCK=I(i1:i1+7,i2:i2+7);
win1=DCT_matrix8*zBLOCK*iDCT_matrix8;
dct_domain(i1:i1+7,i2:i2+7)=win1;
end
end
for i1=[1:8:row]
for i2=[1:8:coln]
win1 = dct_domain(i1:i1+7,i2:i2+7);
win2=round(win1./QX);
dct_quantized(i1:i1+7,i2:i2+7)=win2;
end
end
for i1=[1:8:row]
for i2=[1:8:coln]
win2 = dct_quantized(i1:i1+7,i2:i2+7);
win3 = win2.*QX;
dct_dequantized(i1:i1+7,i2:i2+7) = win3;
конец
конец
для i1=[1:8:строка]
для i2=[1:8:столбец]
win3 = dct_dequantized(i1:i1+7,i2:i2+7);
win4=iDCT_matrix8*win3*DCT_matrix8;
dct_restored(i1:i1+7,i2:i2+7)=win4;
конец
конец
I2=dct_restored;
K=mat2gray(I2);
subplot(1,2,1);
imshow(I1);title('исходное изображение');
subplot(1,2,2);
imshow(K);title('восстановленное изображение из dct');
% Программа MATLAB для сжатия цветного изображения в формате JPEG
% Для простоты используется только одна таблица/матрица квантования
clc;
очистить всё;
закрыть все;
Q = [16 11 10 16 24 40 51 61 ;
12 12 14 19 26 28 60 55 ;
14 13 16 24 40 57 69 56 ;
14 17 22 29 51 87 80 62 ;
18 22 37 56 68 109 103 77 ;
24 35 55 64 81 104 113 92 ;
49 64 78 87 103 121 120 101;
72 92 95 98 112 100 103 99];
I = imread('peppers.png');
%I = imread('saturn.png');
%I = imread('Maulik.png');
ImageSize = 8*prod(size(I));
Y_d = rgb2ycbcr(I );
% Понижение частоты дискретизации:
Y_d(:,:,2) = 2*round(Y_d(:,:,2)/2);
Y_d(:,:,3) = 2*round(Y_d(:,:,3)/2);
% Сжатие DCT:
A = zeros(size(Y_d));
B = A;
для канала = 1:3
для j = 1:8:size(Y_d,1)-7
для k = 1:8:size(Y_d,2)-7
II = Y_d(j:j+7,k:k+7,channel);
freq = dct2(II);
freq = Q.*round(freq./Q);
A(j:j+7,k:k+7,channel) = freq;
% одновременно выполнить обратное действие:
B(j:j+7,k:k+7,channel) = idct2(freq);
end
end
end
b = A(:);
b = b(:);
b(b==0)=[]; % удалить нули.
b = floor(255*(b-min(b))/(max(b)-min(b)));
symbols = unique(b);
prob = histcounts(b,length(symbols))/length(b);
dict = huffmandict(symbols, prob);
enco = huffmanenco(b, dict);
FinalCompressedImage = length(enco);
disp('достигнутое сжатие:');
ImageSize/FinalCompressedImage
subplot(1,2,1)
imshow(I)
title('Исходное изображение')
subplot(1,2,2)
imshow(ycbcr2rgb(uint8(B)));
title('Сжатое изображение')
Доступные форматы для скачивания:
Скачать видео mp4
-
Информация по загрузке: