对灰度图像进行Huffman编码matlab,不使用自带的函数
时间: 2023-06-20 10:03:25 浏览: 144
基于Matlab实现灰度图像赫夫曼编码(数字图像处理实验).zip
Huffman编码是一种无损压缩算法,可以对灰度图像进行压缩。下面是用Matlab实现灰度图像的Huffman编码的代码:
```matlab
% 读入灰度图像
img = imread('gray_image.jpg');
% 统计像素值出现的频率
histogram = imhist(img);
% 计算出现频率不为0的像素个数
num_of_pixels = sum(histogram > 0);
% 初始化森林和哈夫曼编码树
forest = cell(num_of_pixels, 1);
for i = 1:num_of_pixels
forest{i} = struct('value', [], 'prob', [], 'left', [], 'right', []);
end
% 将像素值和频率存入森林中
j = 1;
for i = 1:256
if histogram(i) > 0
forest{j}.value = i - 1;
forest{j}.prob = histogram(i) / numel(img);
j = j + 1;
end
end
% 构建哈夫曼编码树
while numel(forest) > 1
% 按概率从小到大排序
[~, idx] = sort([forest{:}.prob]);
forest = forest(idx);
% 取出概率最小的两个节点
left = forest{1};
right = forest{2};
% 合并节点
parent = struct('value', [], 'prob', left.prob + right.prob, 'left', left, 'right', right);
% 将父节点加入森林中
forest{2} = parent;
forest(1) = [];
end
% 生成哈夫曼编码表
codes = cell(num_of_pixels, 1);
generate_codes(forest{1}, '');
% 对图像进行编码
encoded_img = '';
for i = 1:size(img, 1)
for j = 1:size(img, 2)
idx = find([forest{:}].value == img(i, j));
encoded_img = [encoded_img, codes{idx}];
end
end
% 将编码后的字符串写入文件
fid = fopen('encoded_image.txt', 'w');
fwrite(fid, encoded_img, 'ubit1');
fclose(fid);
% 生成哈夫曼编码表的函数
function generate_codes(node, code)
if ~isempty(node.value)
idx = find([node.parent{:}.value] == node.value);
codes{idx} = code;
else
generate_codes(node.left, [code, '0']);
generate_codes(node.right, [code, '1']);
end
end
```
代码中使用了一个名为`generate_codes`的函数,这个函数用于生成哈夫曼编码表。在函数中,我们首先判断当前节点是否为叶子节点,如果是叶子节点,则在编码表中记录下该像素值对应的哈夫曼编码;否则,我们递归地遍历左子树和右子树,并在编码的末尾加上'0'或'1'。
最后,我们将编码后的字符串写入文件中,便完成了灰度图像的Huffman编码。需要注意的是,由于Huffman编码是变长编码,所以我们需要使用`ubit1`格式写入文件,即每个字符只占用1位。
阅读全文