Clear Filters
Clear Filters

i found a huffman code code from matlab examples which was for strings ,,now am implementing the same with images

2 views (last 30 days)

I am getting error as

Error using horzcat Dimensions of matrices being concatenated are not consistent.

Please anyone help

Here is the complete code and the error am getting is at line

% % Form Huffman Tree Data tree = [newq_str,init_str];
tree_prob = [newq_prob, init_prob]';

and for input you can give any rgb image.

Attached is the input image I used.

actually, i wanted to take the red_channel pixels separate huffman code followed by green and blue all the three channels separately .

then apply some chaotic process on all three channel huffman coded data and then again decode it back

can you please help in implementation

thank you

% Hufmman Coding Example
%
%  By Jason Agron
% ************************
% Setup the MATLAB console
clc;
clear all;
close all;
%load tha rgb image
 rgb_image = imread('rgb1.jpg');
 % Display the original image
figure(1)
imshow(rgb_image)
title('Original rgb Image');
%% ----------- RGB to grey conversion------------%%
gray_image = rgb2gray(rgb_image);
r_gray = gray_image(:,:,1);
figure(2)
imshow(r_gray)
title('red channel to  gray ');
% g_gray = gray_image(:,:,2);
% b_gray = gray_image(:,:,3);
% %convert to string
 out_r=num2str(r_gray)
% %   out_g=num2str(g_gray)
% %     out_b=num2str(b_gray)
%
% % User-Defined Input
% Define the character string
my_str = out_r;
auto_prob = 1;
% % Probability Calculation Flag
if (auto_prob == 1)
    % Automatically calculate the probability distribution
    % Get ASCII version of each character
    % Each ASCII value represents the probability of finding the character
    prob_dist = double(my_str);
else
    % Manually define the probability distribution
%     prob_dist = [10 19 30 40 50];
end
% % Encoding Bit Calculation
num_bits = ceil(log2(length(prob_dist)))
% % Display character vs. probability
disp('Character Probability:');
for i = 1:length(prob_dist)
display(strcat(my_str(i),' -->  ',num2str(prob_dist(i))));
end
total = sum(prob_dist)
% % Initialize The Encoding Array
for i = 1:length(my_str)
sorted_str{i} = my_str(i);
end
% Save initial set of symbols and probabilities for later use
init_str = sorted_str;
init_prob = prob_dist;
%
% % Huffman Encoding Process
sorted_prob = prob_dist;
rear = 1;
while (length(sorted_prob) > 1)
% Sort probs
[sorted_prob,indeces] = sort(sorted_prob,'ascend');
% Sort string based on indeces
sorted_str = sorted_str(indeces);
% Create new symbol
new_node = strcat(sorted_str(2),sorted_str(1));
new_prob = sum(sorted_prob(1:2));
% Dequeue used symbols from "old" queue
sorted_str =  sorted_str(3:length(sorted_str));
sorted_prob = sorted_prob(3:length(sorted_prob));
% Add new symbol back to "old" queue
sorted_str = [sorted_str, new_node];
sorted_prob = [sorted_prob, new_prob];
% Add new symbol to "new" queue
newq_str(rear) = new_node;
newq_prob(rear) = new_prob;
rear = rear + 1;
end
%
% % Form Huffman Tree Data
tree = [newq_str,init_str];
tree_prob = [newq_prob, init_prob]';
% Sort all tree elements
[sorted_tree_prob,indeces] = sort(tree_prob,'descend');
sorted_tree = tree(indeces);
%
% Calculate Tree Parameters
parent(1) = 0;
num_children = 2;
for i = 2:length(sorted_tree)
% Extract my symbol
me = sorted_tree{i};
% Find my parent's symbol (search until shortest match is found)
count = 1;
parent_maybe = sorted_tree{i-count};
diff = strfind(parent_maybe,me);
while (isempty(diff))
count = count + 1;
parent_maybe = sorted_tree{i-count};
diff = strfind(parent_maybe,me);
end
parent(i) = i - count;
end
% Plot the Huffman Tree
treeplot(parent);
title(strcat('Huffman Coding Tree - "',my_str,'"'));
% Console Output - Tree Symbols and Their Probabilities
display(sorted_tree)
display(sorted_tree_prob)
% Extract binary tree parameters
[xs,ys,h,s] = treelayout(parent);
% Label Tree Nodes
text(xs,ys,sorted_tree);
% Label Tree Edges
for i = 2:length(sorted_tree)
% Get my coordinate
my_x = xs(i);
my_y = ys(i);
% Get parent coordinate
parent_x = xs(parent(i));
parent_y = ys(parent(i));
% Calculate weight coordinate (midpoint)
mid_x = (my_x + parent_x)/2;
mid_y = (my_y + parent_y)/2;
% Calculate weight (positive slope = 1, negative = 0)
slope  = (parent_y - my_y)/(parent_x - my_x);
if (slope > 0)
weight(i) = 1;
else
weight(i) = 0;
end
text(mid_x,mid_y,num2str(weight(i)));
end
% Huffman Codebook Calculation
for i = 1:length(sorted_tree)
% Initialize code
code{i} = '';
% Loop until root is found
index = i;
p = parent(index);
while(p ~= 0)
% Turn weight into code symbol
w = num2str(weight(index));
% Concatenate code symbol
code{i} = strcat(w,code{i});
% Continue towards root
index = parent(index);
p = parent(index);
end
end
% Console Output - Huffman Codebook
codeBook = [sorted_tree', code']

Answers (0)

Tags

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!