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={'bear.bmp','400','8','1','0','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 > x 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 > y 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); % % Обрахунок для y (1:20) % for i = 1:20 % i_value_brightness = II(random_point_x(i), random_point_y(i)); % point_restore_image_x(i) = random_point_x(i); % point_restore_image_y(i)= random_point_y(i); % % if III(random_point_x(i), random_point_y(i)) == i_value_brightness % continue % else % for j = 1:255 % point_restore_image_y(i) = point_restore_image_y(i) + j; % if (point_restore_image_y(i) >= x) || (point_restore_image_y(i) < 0) % break % end % % if III(point_restore_image_x(i), point_restore_image_y(i)) == i_value_brightness % break % end % end % point_restore_image_y(i) = random_point_y(i); % for k = 1:255 % point_restore_image_y(i) = point_restore_image_y(i) - k; % if (point_restore_image_y(i) >= y) || (point_restore_image_y(i) < 0) % break % end % % % if III(point_restore_image_x(i), point_restore_image_y(i)) == i_value_brightness % break % end % end % % end % end 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('Точки після відновлення')