Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- %Тест для алгоритма фрактального сжатия и декомпрессии изображений:
- %NOTE: В данной версии поддерживаются только квадратные изображения!!!
- function test(fname)
- if (nargin < 1); fname = 'test.bmp'; end
- %Считываем изображение и конвертируем его в массив double + делаем изображение квадратным:
- IMG = double(imread(fname)) / 255; len = size(IMG); len = min(len(1 : 2)); IMG = IMG(1 : len, 1 : len, :);
- %Формируем массив ранговых блоков: (NOTE: mod(len, len1) == 0)!!!
- num1 = 10; len1 = floor(len / num1);
- for i = 1 : num1; for j = 1 : num1; ind1(i, j).row = (i - 1) * len1 + [1 : 1 : len1]; ind1(i, j).col = (j - 1) * len1 + [1 : 1 : len1]; end; end
- %Формируем массив доменных блоков:
- num2 = num1 - 1; len2 = 2 * len1;
- for i = 1 : num2; for j = 1 : num2; ind2(i, j).row = (i - 1) * len1 + [1 : 2 : len2]; ind2(i, j).col = (j - 1) * len1 + [1 : 2 : len2]; end; end
- %(ПРОЦЕДУРА СЖАТИЯ):
- %Перебираем ранговые блоки:
- for i = 1 : num1; for j = 1 : num1
- R0 = IMG(ind1(i, j).row, ind1(i, j).col, :);
- %Перебираем доменные блоки:
- k0 = 1; l0 = 1; p0 = 0;
- q0 = 0; d0 = inf;
- for k = 1 : num2; for l = 1 : num2
- %Вычисляем "расстояние" между блоками:
- D0 = IMG(ind2(k, l).row, ind2(k, l).col, :);
- for p = 0 : 3
- q = mean(R0(:)) - 0.75 * mean(D0(:)); %q -- сдвиг по яркости; 0.75 -- коэффициент изменения контраста;
- d = sum((R0(:) - 0.75 * D0(:) + q).^ 2);
- if (d < d0)
- k0 = k; l0 = l; p0 = p;
- q0 = q; d0 = d;
- end
- if (p == 3); break; end
- D0 = rotate(D0, len1, 1);
- end
- end
- end
- %...
- disp([num2str(j + (i - 1) * num1), '/', num2str(num1 * num1)]);
- %...
- Fac(i, j).k = k0; Fac(i, j).l = l0;
- Fac(i, j).p = p0;
- Fac(i, j).q = q0;
- end
- end
- %...
- close all
- f1 = figure; set(gcf, 'Position', [300, 300, 500, 500]);
- f2 = figure; set(gcf, 'Position', [805, 300, 500, 500]);
- figure(f1);
- image(IMG);
- %(ДЕКОДЕР):
- %Запускаем итерационный процесс:
- IMG(:) = 0; BUF = zeros(size(IMG));
- for it = 1 : 10 %Для пробы --- делаем 10 итераций!!!
- %Перебираем ранговые блоки:
- for i = 1 : num1; for j = 1 : num1
- k0 = Fac(i, j).k; l0 = Fac(i, j).l;
- p0 = Fac(i, j).p; q0 = Fac(i, j).q;
- tmp = rotate(IMG(ind2(k0, l0).row, ...
- ind2(k0, l0).col, ...
- :), ...
- len1, p0);
- BUF(ind1(i, j).row, ...
- ind1(i, j).col, ...
- :) = 0.75 * tmp + q0;
- end
- end
- IMG = min(1.0, max(0, BUF)); %Корректируем диапазон цветов;
- figure(f2);
- image(IMG);
- getframe();
- title(['step: ', num2str(it)]);
- pause(0.5);
- end
- end
- %Выполняет вращение блока:
- function R = rotate(IMG, n, t)
- R = IMG;
- for l = 1 : t
- for k = 1 : n; R(k, :, :) = IMG(:, k, :); end
- IMG = R;
- end
- end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement