那么我希望能看到原图像每个灰度值所对应的编码,怎么修改程序,给出完整程序
时间: 2024-03-24 19:39:24 浏览: 16
以下是修改后的完整程序,它添加了一个编码表格,用于显示每个灰度值的编码结果:
```matlab
% 读取灰度图像
img = imread('lena_gray.png');
img = double(img);
% 建立概率模型
counts = histcounts(img(:), 0:255);
prob = counts / numel(img);
% 计算累积概率分布
cum_prob = cumsum(prob);
% 初始化算术编码参数
range_low = 0;
range_high = 1;
precision = 32;
code = uint32(0);
code_len = 0;
% 初始化编码表格
code_table = strings(256, 2);
% 逐行处理像素值进行算术编码
for i = 1:size(img, 1)
for j = 1:size(img, 2)
% 找到当前像素值的概率区间
pixel_val = img(i, j);
prob_range = cum_prob(pixel_val+1) - prob(pixel_val+1);
% 更新编码参数
range_length = range_high - range_low;
range_high = range_low + range_length * cum_prob(pixel_val+1);
range_low = range_low + range_length * prob_range;
% 进行编码
while (true)
% 如果编码区间的上界大于等于0.5,输出0
if (range_high >= 0.5)
code = bitshift(code, 1);
code_len = code_len + 1;
range_high = range_high - 0.5;
% 如果编码区间的下界小于0.5,输出1
elseif (range_low < 0.5)
code = bitshift(code, 1);
code = bitor(code, uint32(1));
code_len = code_len + 1;
range_low = range_low + 0.5;
% 如果编码区间完全在0.5的两侧,不输出
else
break;
end
% 如果编码长度达到精度要求,停止编码
if (code_len >= precision)
break;
end
end
% 将编码结果添加到编码表格中
code_table(pixel_val+1, 1) = num2str(pixel_val);
code_table(pixel_val+1, 2) = code_table(pixel_val+1, 2) + dec2bin(code, code_len);
end
end
% 将编码结果以二进制字符串的形式存储到文件中
code_str = dec2bin(code, code_len);
fid = fopen('lena_gray_code.txt', 'w');
fprintf(fid, '%s', code_str);
fclose(fid);
% 输出编码结果和编码表格
disp(['编码结果为:', code_str]);
disp('编码表格为:');
disp(code_table);
```
这个程序在每次编码时,将编码结果添加到一个编码表格中。编码表格是一个256行2列的字符串矩阵,第一列存储灰度值,第二列存储编码结果。程序执行完成后,会输出编码结果和编码表格。