clc; clear all; % ЛАБОРАТОРНА РОБОТА №1-2 % СТИСНЕННЯ ЦИФРОВИХ ВІДЕОЗОБРАЖЕНЬ ЗА JPEG-АЛГОРИТМОМ % % ВВЕДЕННЯ ПОЧАТКОВИХ ДАНИХ prompt={'ІМ"Я ФАЙЛА ЗОБРАЖЕННЯ',... 'РОЗМІР ЗОБРАЖЕННЯ КxК ДИСКР. ТОЧОК: К=32,64,128,256,512',... 'РОЗМІР БЛОКУ ДКП NxN ДИСКР. ТОЧОК: N=4,8,16,32,64,128,256,512',... 'МЕТОД ОБЧИСЛЕННЯ ДКП: 1-СУМА; 2-МАТРИЦІ',... 'КІЛЬКІСТЬ НЕНУЛЬОВИХ КОЕФ. ДКП: М=1,2,...,N; 0-МЕТОД НЕ ВИКОРИСТ.',... 'ПОРІГ ДЛЯ НЕНУЛЬОВИХ КОЕФ. ДКП: Р=1,...,255; 0-МЕТОД НЕ ВИКОРИСТ.',... 'ВИВЕДЕННЯ РЕЗУЛЬТАТІВ: 1-ЗОБРАЖЕННЯ; 2-ТАБЛИЦЯ; 3-ЗОБР. І ТАБЛ.'}; def={'resized_image2.jpg','480','4','1','1','0','3'}; dlgTitle='ЛАБОРАТОРНА РОБОТА №1-2'; lineNo=1; AddOpts.Resize='on'; AddOpts.WindowStyle='normal'; AddOpts.Interpreter='tex'; Answer=inputdlg(prompt,dlgTitle,lineNo,def,AddOpts); ImageName=Answer{1}; % ІМ"Я ФАЙЛА ЗОБРАЖЕННЯ K=str2double(Answer{2}); % РОЗМІР ЗОБРАЖЕННЯ КxК ДИСКР. ТОЧОК N=str2double(Answer{3}); % РОЗМІР БЛОКУ ДКП NxN ДИСКР. ТОЧОК TypeCalc=str2double(Answer{4}); % МЕТОД ОБЧИСЛЕННЯ ДКП M=str2double(Answer{5}); % КІЛЬКІСТЬ НЕНУЛЬОВИХ КОЕФ. ДКП P=str2double(Answer{6}); % ПОРОГ ДЛЯ НЕНУЛЬОВИХ КОЕФ. ДКП TypeOutput=str2double(Answer{7}); % ВИВЕДЕННЯ РЕЗУЛЬТАТІВ % ІНІЦІАЛІЗАЦІЯ ЗМІННИХ OrigImage=zeros(K,K); RestoreImage=zeros(K,K); CoefDCT=zeros(K,K); CoefDCTCompress=zeros(K,K); CoefMul=zeros(N,N); % ЗАВАНТАЖЕННЯ ПОЧАТКОВОГО ЗОБРАЖЕННЯ RGB=imread(ImageName); II=rgb2gray(RGB); OrigImage=II(1:K,1:K); % ОБЧИСЛЕННЯ ДКП switch TypeCalc case 1 Time1=cputime; fun=@dct2; CoefDCT=blkproc(OrigImage,[N N],fun); Time2=cputime; fprintf('\nЧАС ОБЧИСЛЕННЯ ПРЯМОГО ДКП (СУМА) %7.3f СЕКУНД\n',Time2-Time1); case 2 Time1=cputime; CoefMul=dctmtx(N); fun = inline('P1*double(x)*ctranspose(P1)', 1); CoefDCT=blkproc(OrigImage, [N N], fun, CoefMul); Time2=cputime; fprintf('\nЧАС ОБЧИСЛЕННЯ ПРЯМОГО ДКП (МАТРИЦІ) %7.3f СЕКУНД\n',Time2-Time1); end % СТИСНЕННЯ ЗОБРАЖЕННЯ if P~=0 CoefDCTCompress=CoefDCT; CoefDCTCompress((abs(CoefDCTCompress)) 0 if ismember( RestoreImage(restoreImageCord_x(i) - j , restoreImageCord_y(i)),rangeValueBrightness_i) restoreImageCord_x(i) = restoreImageCord_x(i) - j; break end end if j > N * 2 restoreImageCord_x(i) = randomCoord_x(i); break end j = j + 1 ; end end for i = 1:20 valueBrightness_i = II(randomCoord_x(i), randomCoord_y(i)); rangeValueBrightness_i = valueBrightness_i - val :valueBrightness_i + val; j = 0; while true if restoreImageCord_y(i) + j < y if ismember( RestoreImage(restoreImageCord_x(i) , restoreImageCord_y(i) + j),rangeValueBrightness_i) restoreImageCord_y(i) = restoreImageCord_y(i) + j; break end end if restoreImageCord_y(i) - j > 0 if ismember( RestoreImage(restoreImageCord_x(i) , restoreImageCord_y(i) - j),rangeValueBrightness_i) restoreImageCord_y(i) = restoreImageCord_y(i) - j; break end end if j > N * 2 restoreImageCord_y(i)= randomCoord_y(i); break end j = j + 1 ; end end dx = randomCoord_x - restoreImageCord_x; dy = randomCoord_y - restoreImageCord_y; dx_dy= cat(2,dx,dy) summ = 0; L = 40; for i = 1:L summ = summ + (dx_dy(i))^2; end deltaCoord = sqrt(summ/L); subplot(1, 2, 1); hold on; imshow(OrigImage); plot(randomCoord_x, randomCoord_y, 'b*'); title('Точки до стиснення'); subplot(1, 2, 2); hold on; imshow(RestoreImage); plot(restoreImageCord_x, restoreImageCord_y, 'r*'); title('Точки після відновлення');