% 读取图像 im = imread('Test.png'); im = double(im); % 统计像素值频率 freq = zeros(1, 256); for i = 1:size(im, 1) for j = 1:size(im, 2) freq(im(i, j) + 1) = freq(im(i, j) + 1) + 1; end end % 构造哈夫曼树 n = length(freq); node = cell(n, 1); for i = 1:n node{i} = struct('value', i - 1, 'freq', freq(i), 'left', [], 'right', []); end while length(node) > 1 [freqs, idx] = sort(cellfun(@(x) x.freq, node)); left = node{idx(1)}; right = node{idx(2)}; node{idx(1)} = struct('value', [], 'freq', left.freq + right.freq, 'left', left, 'right', right); node(idx(2)) = []; end tree = node{1}; % 构造哈夫曼编码表 code = cell(n, 1); for i = 1:n code{i} = ''; end traverse(tree, '', code); % 对图像进行编码 im_code = ''; for i = 1:size(im, 1) for j = 1:size(im, 2) im_code = [im_code code{im(i, j) + 1}]; end end im_code = reshape(im_code, [], 8); im_code = bin2dec(im_code); im_code = uint8(im_code); % 对编码后的图像进行解码 im_decode = ''; for i = 1:length(im_code) im_decode = [im_decode dec2bin(im_code(i), 8)]; end im_decode = reshape(im_decode, [], 8); im_decode = bin2dec(im_decode); im_decode = uint8(im_decode); im_decode = reshape(im_decode, [], size(im,2), size(im,3)); % 显示原图、编码后的图和解码后的图 figure subplot(1, 3, 1) imshow(uint8(im)) title('原图') im_code = im2uint8(im_code); subplot(1, 3, 2) imshow(im_code) title('编码后的图') subplot(1, 3, 3) im_decode = im2uint8(im_decode); imshow(im_decode) title('解码后的图') % 哈夫曼树的遍历函数 function traverse(node, code, table) if ~isempty(node.value) table{node.value + 1} = code; else traverse(node.left, [code '0'], table); traverse(node.right, [code '1'], table); end end
时间: 2024-01-05 11:04:04 浏览: 63
您的代码看起来没有问题,但是我注意到您在对图像进行编码后,使用了 `bin2dec` 和 `dec2bin` 函数来进行二进制和十进制之间的转换。这个过程可能会导致精度损失,从而导致解码后的图像与原图不完全一致。
建议您使用 `bitget` 和 `bitset` 函数来进行二进制和整数之间的转换,这样可以确保精度的准确性。您可以将以下代码替换原有的编码和解码代码段:
```matlab
% 对图像进行编码
im_code = zeros(1, numel(im));
code_idx = 1;
for i = 1:size(im, 1)
for j = 1:size(im, 2)
im_code(code_idx:code_idx+numel(code{im(i, j) + 1})-1) = ...
bitget(uint8(code{im(i, j) + 1}), 8:-1:1);
code_idx = code_idx + numel(code{im(i, j) + 1});
end
end
% 对编码后的图像进行解码
im_decode = zeros(size(im));
decode_idx = 1;
for i = 1:size(im, 1)
for j = 1:size(im, 2)
code_len = numel(code{im(i, j) + 1});
im_decode(i, j) = ...
bitset(0, 8:-1:9-code_len, im_code(decode_idx:decode_idx+code_len-1));
decode_idx = decode_idx + code_len;
end
end
```
希望这个解决方案可以帮到您。
阅读全文