Matlab实现算术编码 灰度图像 静态模型

一、算术编码原理

这个资料有很多,可自行查阅其他博客或者书籍。
这篇博客写得很好,推荐一下。
https://blog.youkuaiyun.com/zzq060143/article/details/89307513

二、做灰度图像算术编码的一些关键问题

(1) 由于计算机精度有限,小数所能表达的精度是有限的,所以当编码到一定程度就会发生数据溢出。为了解决这个问题,每本篇博客采用的方法是:当数据溢出之前,将已经编码部分保存,然后重新从0~1的区间开始编码。会一定程度降低编码的性能,具体的自己去考虑考虑。
(2) 本节实现的是静态模型的算术编码,统计整幅图像灰度的频率,不随编码过程变化。传输时需要传输符号(灰度)表及其对应的频率、编码的码字及每个码字需要解码符号的数量,本实验将这些数据输出为一个2进制文件。
(3) 本实验为了在不同的计算机之间实现完整的图像通信过程,采用了Matlab的数据类型去输出成文件,这样的结果是数据信息会有很大的冗余,造成数据量偏大,所以计算压缩比的时候通过编码时编码成的二进制码字的比特数去计算,而不使用输出成的文件大小去计算,这也是我这个程序现在的问题,但是多思考一下应该可以解决,有兴趣的可以去试试。

三、代码及说明

  1. 本实验程序共5个.m文件
  2. BasicArithmeticCode.m、BasicArithmeticDecode.m分别是编码和解码算法。
  3. Encoder.m、Decoder.m分别是编码器和解码器,他们调用以上的两个算法。
  4. CaculateBits.m是用来计算压缩后总的比特数的文件,在BasicArithmeticCode.m中调用,但是由于时间代价高,默认注释掉,需要计算的时候再用。
  5. 整个操作流程:运行Encoder会读入Set12中的12张图片然后输出.dat数据文件,再运行Decoder就会读入数据文件,输出解码后的图像。
  6. 运行程序需要改动的地方:将Encoder中的图像读入路径改为你的路径;
    如改为:[‘D:\xxxxx\Set12’,num2str(i),’.png’] (只需修改xxxxx部分)

四、 下载地址

优快云: https://download.youkuaiyun.com/download/qq_38843532/12478972
GITHUB:

下面是一个使用算术编码对二维灰度图像进行压缩和解压的Matlab程序。程序中使用了ArithmeticCoder类来实现算术编码,以及相应的解码过程。 ```matlab % 读取图像 img = imread('lena_gray.png'); % 显示原始图像 imshow(img); title('Original Image'); % 将图像转换为一维向量 symbols = img(:); % 计算符号概率分布 counts = histcounts(symbols, 0:255); prob = counts / sum(counts); % 初始化编码器和解码器 encoder = ArithmeticCoder(0, 1, 32); decoder = ArithmeticCoder(0, 1, 32); % 对每个符号进行编码 for i = 1:length(symbols) encoder.encode(symbols(i), prob); end % 输出压缩后的数据 compressed = encoder.get_compressed_data(); fprintf('Compressed size: %d bytes\n', length(compressed)); % 解码压缩数据 decoded_symbols = []; for i = 1:length(symbols) decoded_symbols(i) = decoder.decode(compressed, prob); end decoded_img = reshape(decoded_symbols, size(img)); % 显示解码后的图像 figure; imshow(decoded_img); title('Decoded Image'); % 计算压缩比 original_size = numel(img); compressed_size = length(compressed); compression_ratio = original_size / compressed_size; fprintf('Compression ratio: %f\n', compression_ratio); ``` 程序中首先读取了一个灰度图像,并将其转换为一维向量。然后计算了符号概率分布,并初始化了编码器和解码器。接下来对每个符号进行编码,最后输出压缩后的数据和解码后的图像。程序最后计算了压缩比,并输出到控制台。 需要注意的是,由于算术编码是一种无损压缩方法,因此解码后的图像与原始图像应该是完全一致的,但压缩比可能会有所不同。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值