Advertisement
Guest User

Huffman Coding

a guest
Nov 26th, 2014
253
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Octave 3.90 KB | None | 0 0
  1. clear all
  2. struct_levels_to_print(20);
  3.  
  4. # Lendo imagem e calculando histograma
  5. #######################################################################
  6.     img = imread("brain.jpg");
  7.  
  8. # Criando histograma
  9.     [w, h] = size(img);
  10.     count = w*h;
  11.  
  12.     histogram = [1:256];
  13.     histogram(1:256) = 0;
  14.  
  15.     # Preenchendo
  16.     for i = 1:count
  17.       histogram(img(i) + 1) = histogram(img(i) + 1) + 1;
  18.     endfor
  19.    
  20.     #normalizando
  21.     for i = 1:256
  22.       histogram(i) = histogram(i) / count;
  23.     endfor
  24.  
  25.  
  26. # Criando a árvore do dicionário de huffman
  27. #######################################################################
  28. memory = {};
  29. flag = true;
  30. REMOVED_FREQ = 2;
  31. last_built_tree = -1;
  32.  
  33. function retval = istree (mem, c)
  34.     retval = isfield(mem, strcat("a", num2str(c)));
  35. endfunction
  36.  
  37. function retval = gettree (mem, c)
  38.     retval = getfield(mem, strcat("a", num2str(c)));
  39. endfunction
  40.  
  41. function retval = settree (mem, c, tree)
  42.     retval = setfield(mem, strcat("a", num2str(c)), tree);
  43. endfunction
  44.  
  45.  
  46.  
  47. # removendo cores com probabilidade zero
  48. [freq, col] = sort(histogram);
  49.  
  50. i = 1;
  51. while(flag)
  52.     if (freq(i) == 0)
  53.         histogram(col(i)) = REMOVED_FREQ;
  54.     else
  55.         flag = false;
  56.     endif
  57.     i = i + 1;
  58. endwhile
  59.  
  60. # criando a árvore de huffman
  61. flag = true;
  62. while(flag)
  63.     [freq, col] = sort(histogram);
  64.     a = col(1);
  65.     b = col(2);
  66.     freq_a = freq(1);
  67.     freq_b = freq(2);
  68.    
  69.    
  70.  
  71.     a_is_a_tree = istree(memory, a);
  72.     b_is_a_tree = istree(memory, b);
  73.    
  74.     if (freq_a == REMOVED_FREQ)
  75.         flag = false;
  76.     elseif (freq_b == REMOVED_FREQ)
  77.         flag = false;
  78.     else
  79.         newtree = {};
  80.         if (a_is_a_tree && b_is_a_tree)
  81.             newtree.left = gettree(memory, a);
  82.             newtree.right = gettree(memory, b);
  83.             memory = settree(memory, a, newtree);
  84.         elseif (a_is_a_tree)
  85.             newtree.left = gettree(memory, a);
  86.             newtree.right = freq_b;
  87.             newtree.right_color = b;
  88.             memory = settree(memory, a, newtree);
  89.         elseif (b_is_a_tree)
  90.             newtree.left = freq_a;
  91.             newtree.left_color = a;
  92.             newtree.right = gettree(memory, b);
  93.             memory = settree(memory, a, newtree);
  94.         else
  95.             newtree.left = freq_a;
  96.             newtree.left_color = a;
  97.             newtree.right = freq_b;
  98.             newtree.right_color = b;
  99.             memory = settree(memory, a, newtree);
  100.         endif
  101.        
  102.         last_built_tree = a;
  103.         histogram(a) = freq_a + freq_b;
  104.         histogram(b) = REMOVED_FREQ;
  105.     endif
  106. endwhile
  107.  
  108. huffmantree = gettree(memory, last_built_tree);
  109.  
  110. # Criando o dicionário de huffman
  111. #######################################################################
  112.  
  113.  
  114. stack = {};
  115. dict = {};
  116. flag = true;
  117. i = 1;
  118. stack_top = 2;
  119.  
  120. element = {};
  121. element.branch = huffmantree;
  122. element.code = "";
  123.  
  124. stack.a1 = element;
  125.  
  126.  
  127. while(flag)
  128.     istr = strcat("a", num2str(i));
  129.  
  130.     if (isfield(stack, istr))
  131.         t = getfield(stack, istr);
  132.        
  133.         if (isfield(t.branch, "left_color"))
  134.             code = strcat(t.code, "1");
  135.             dict = setfield(dict, strcat("a", num2str(t.branch.left_color)), code);
  136.         else
  137.             element = {};
  138.             element.branch = t.branch.left;
  139.             element.code = strcat(t.code, "1");
  140.            
  141.             stack = setfield(stack, strcat("a", num2str(stack_top)), element);
  142.             stack_top = stack_top + 1;
  143.         endif
  144.        
  145.         if (isfield(t.branch, "right_color"))
  146.             code = strcat(t.code, "0");
  147.             dict = setfield(dict, strcat("a", num2str(t.branch.right_color)), code);
  148.         else
  149.             element = {};
  150.             element.branch = t.branch.right;
  151.             element.code = strcat(t.code, "0");
  152.            
  153.             stack = setfield(stack, strcat("a", num2str(stack_top)), element);
  154.             stack_top = stack_top + 1;
  155.         endif
  156.     else
  157.         flag = false;
  158.     endif
  159.     i = i + 1;
  160. endwhile
  161.  
  162.  
  163. # Codificando a imagem
  164. #######################################################################
  165.  
  166.     encoded_image = "Image: ";
  167.  
  168.     [w, h] = size(img);
  169.     count = w*h;
  170.     for i = 1:count
  171.         c = img(i) + 1;
  172.         v = getfield(dict, strcat("a", int2str(c)));
  173.         encoded_image = strcat(encoded_image, v, ".");
  174.     endfor
  175.    
  176. # Mostrando o código gerado
  177. #######################################################################
  178.  
  179.     encoded_image
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement