图像压缩处理 - 预测编码

概念

预测编码是属于时间领域的编码法。利用前面已经出现了的符号来预测目前的符号,然后将实际上的符号与预测符号得到预测误差,将此误差编码并送出。

应用

预测编码数据压缩技术建立在信号数据的相关性上, 它根据某一模型,利用以前的样本值对新样本进行预测,以此减少数据在时间和空间上的相关性,从而达到压缩数据的目的

预测编码基本思想

通过对每个像素中像素当前实际值和预测值的差进行提取和编码,以此来消除像素间的冗余。

线性预测

LPC, Linear predictive coding)是主要用于音频信号处理与语音处理中根据线性预测模型的信息用压缩形式表示数字语音信号。它是最有效的语音分析技术之一,也是低位速下编码方法高质量语音最有用的方法之一,它能够提供非常精确的语音参数预测。

在这里插入图片描述
平均方差
Mean Squared Error(MSE)
在这里插入图片描述

帧内预测

Intra Prediction
帧内/帧间预测是利用像素之间的相关性来去除空间冗余和时间冗余。手段是为当前编码块构造尽可能准确的预测块,从而得到能量较小的残差块。目的是能量较小的残差块可以减少传输比特。

帧内编码用于视频编码(压缩中),通过对已经编码的同一帧内的像素来计算预测值以进行有效的编码从而减少空间冗余,即像素之间的相关性。 预测块P是基于已编码重建快和当前块形成的,当前块减去这个预测块,将差值进行编码。

帧间预测

Inter Prediction
采用基于快的运动补偿从一个或者多个先前编码的图像帧中产生的一个预测模型的

方法:
在这里插入图片描述

帧内&帧间预测

在这里插入图片描述

  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
以下是一个简单的 MATLAB 图像压缩预测编码代码示例: ```matlab % 读取图像 I = imread('lena.bmp'); % 转换为灰度图像 I = rgb2gray(I); % 显示图像 imshow(I); % 设置预测器类型 % 使用差分预测器 predictor = 1; % 将图像划分为 8x8 的块 block_size = 8; [m, n] = size(I); n_blocks_m = floor(m / block_size); n_blocks_n = floor(n / block_size); blocks = cell(n_blocks_m, n_blocks_n); for i = 1:n_blocks_m for j = 1:n_blocks_n blocks{i, j} = I((i-1)*block_size+1:i*block_size, (j-1)*block_size+1:j*block_size); end end % 压缩每个块 for i = 1:n_blocks_m for j = 1:n_blocks_n % 获取当前块 block = blocks{i, j}; % 应用预测器 if i == 1 && j == 1 % 第一个块使用零预测 predicted_block = zeros(size(block)); elseif i == 1 % 第一行块使用行预测 predicted_block = blocks{i, j-1}; elseif j == 1 % 第一列块使用列预测 predicted_block = blocks{i-1, j}; else % 其他块使用差分预测 if predictor == 1 % 差分预测 predicted_block = block - blocks{i, j-1}; else % 中值预测 predicted_block = medfilt2(blocks{i-1:i, j-1:j}); predicted_block = predicted_block(2:end, 2:end); end end % 将预测的块转换为整数 predicted_block = round(predicted_block); % 计算误差 error_block = block - predicted_block; % 将误差转换为整数 error_block = round(error_block); % 将误差编码 encoded_block = rle(error_block(:)); % 存储编码后的块 blocks{i, j} = encoded_block; end end % 解压缩每个块 for i = 1:n_blocks_m for j = 1:n_blocks_n % 获取当前块的编码 encoded_block = blocks{i, j}; % 解码误差 error_block = irle(encoded_block); % 将误差转换为浮点数 error_block = double(error_block); % 应用预测器 if i == 1 && j == 1 % 第一个块使用零预测 predicted_block = zeros(size(error_block)); elseif i == 1 % 第一行块使用行预测 predicted_block = blocks{i, j-1}; elseif j == 1 % 第一列块使用列预测 predicted_block = blocks{i-1, j}; else % 其他块使用差分预测 if predictor == 1 % 差分预测 predicted_block = blocks{i, j-1}; else % 中值预测 predicted_block = medfilt2(blocks{i-1:i, j-1:j}); predicted_block = predicted_block(2:end, 2:end); end end % 将预测的块转换为浮点数 predicted_block = double(predicted_block); % 重建块 decoded_block = predicted_block + error_block; % 存储重建后的块 blocks{i, j} = decoded_block; end end % 合并块以重建图像 reconstructed_image = zeros(m, n); for i = 1:n_blocks_m for j = 1:n_blocks_n reconstructed_image((i-1)*block_size+1:i*block_size, (j-1)*block_size+1:j*block_size) = blocks{i, j}; end end % 显示重建后的图像 imshow(reconstructed_image, []); ``` 注:该代码只实现了简单的差分预测编码,需要根据实际情况进行修改和优化。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

kxwang_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值