i found a huffman code code from matlab examples which was for strings ,,now am implementing the same with images
조회 수: 4 (최근 30일)
이전 댓글 표시
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 input u can give any rgb image
attached the input image
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']
댓글 수: 4
답변 (0개)
참고 항목
카테고리
Help Center 및 File Exchange에서 Source Coding에 대해 자세히 알아보기
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!