Advertisement
Guest User

Untitled

a guest
Jul 23rd, 2017
53
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.28 KB | None | 0 0
  1. %Тест для алгоритма фрактального сжатия и декомпрессии изображений:
  2. %NOTE: В данной версии поддерживаются только квадратные изображения!!!
  3. function test(fname)
  4. if (nargin < 1); fname = 'test.bmp'; end
  5. %Считываем изображение и конвертируем его в массив double + делаем изображение квадратным:
  6. IMG = double(imread(fname)) / 255; len = size(IMG); len = min(len(1 : 2)); IMG = IMG(1 : len, 1 : len, :);
  7. %Формируем массив ранговых блоков: (NOTE: mod(len, len1) == 0)!!!
  8. num1 = 10; len1 = floor(len / num1);
  9. 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
  10. %Формируем массив доменных блоков:
  11. num2 = num1 - 1; len2 = 2 * len1;
  12. 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
  13. %(ПРОЦЕДУРА СЖАТИЯ):
  14. %Перебираем ранговые блоки:
  15. for i = 1 : num1; for j = 1 : num1
  16. R0 = IMG(ind1(i, j).row, ind1(i, j).col, :);
  17. %Перебираем доменные блоки:
  18. k0 = 1; l0 = 1; p0 = 0;
  19. q0 = 0; d0 = inf;
  20. for k = 1 : num2; for l = 1 : num2
  21. %Вычисляем "расстояние" между блоками:
  22. D0 = IMG(ind2(k, l).row, ind2(k, l).col, :);
  23. for p = 0 : 3
  24. q = mean(R0(:)) - 0.75 * mean(D0(:)); %q -- сдвиг по яркости; 0.75 -- коэффициент изменения контраста;
  25. d = sum((R0(:) - 0.75 * D0(:) + q).^ 2);
  26. if (d < d0)
  27. k0 = k; l0 = l; p0 = p;
  28. q0 = q; d0 = d;
  29. end
  30. if (p == 3); break; end
  31. D0 = rotate(D0, len1, 1);
  32. end
  33. end
  34. end
  35. %...
  36. disp([num2str(j + (i - 1) * num1), '/', num2str(num1 * num1)]);
  37. %...
  38. Fac(i, j).k = k0; Fac(i, j).l = l0;
  39. Fac(i, j).p = p0;
  40. Fac(i, j).q = q0;
  41. end
  42. end
  43. %...
  44. close all
  45. f1 = figure; set(gcf, 'Position', [300, 300, 500, 500]);
  46. f2 = figure; set(gcf, 'Position', [805, 300, 500, 500]);
  47. figure(f1);
  48. image(IMG);
  49. %(ДЕКОДЕР):
  50. %Запускаем итерационный процесс:
  51. IMG(:) = 0; BUF = zeros(size(IMG));
  52. for it = 1 : 10 %Для пробы --- делаем 10 итераций!!!
  53. %Перебираем ранговые блоки:
  54. for i = 1 : num1; for j = 1 : num1
  55. k0 = Fac(i, j).k; l0 = Fac(i, j).l;
  56. p0 = Fac(i, j).p; q0 = Fac(i, j).q;
  57. tmp = rotate(IMG(ind2(k0, l0).row, ...
  58. ind2(k0, l0).col, ...
  59. :), ...
  60. len1, p0);
  61. BUF(ind1(i, j).row, ...
  62. ind1(i, j).col, ...
  63. :) = 0.75 * tmp + q0;
  64. end
  65. end
  66. IMG = min(1.0, max(0, BUF)); %Корректируем диапазон цветов;
  67. figure(f2);
  68. image(IMG);
  69. getframe();
  70. title(['step: ', num2str(it)]);
  71. pause(0.5);
  72. end
  73.  
  74. end
  75.  
  76. %Выполняет вращение блока:
  77. function R = rotate(IMG, n, t)
  78. R = IMG;
  79. for l = 1 : t
  80. for k = 1 : n; R(k, :, :) = IMG(:, k, :); end
  81. IMG = R;
  82. end
  83. end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement