JPEG无损压缩流程及简单实现

JPEG无损压缩

一. 前言

续接JPEG有损压缩流程实现接下来简单实现一下无损压缩的主要思想

二. 流程

JPEG无损压缩

无损压缩使用的逻辑是“预测”。由于“量化”一步骤是有损压缩中导致主要误差的一部分,因此在无损压缩中,不能够使用“量化”增大某些数值的出现频率。但是没关系,总有聪明人解决问题。

无损压缩以记录误差的方式,代替真正的图像数值。

无损压缩根据已知的像素点,对当前像素点的值进行预测,进而计算预测值与真实值之间的误差,并进行记录。
在解压缩的时候,通过预测值减去误差,得到真实值。

我们再对误差进行编码,此时误差对分布区间要比图像本身数值的分布区间小聚集得多(具体看实验中的直方图)。此时的压缩就可以达到一个比较好的效果。

三. 代码

主要运行部分,输出原图,以及直方图分布;经过不同预测方法的误差图像,以及直方图分布。

img = imread("15.jpeg");
gray = rgb2gray(img);
error1 = jpg_loss_error_gray1(gray);
error2 = jpg_loss_error_gray2(gray);
error3 = jpg_loss_error_gray3(gray);
subplot(421)
imshow(gray);
subplot(422)
histogram(img);

subplot(423)
imshow(uint8(error1));
subplot(424)
histogram(error1);

subplot(425)
imshow(uint8(error2));
subplot(426)
histogram(error2);

subplot(427)
imshow(uint8(error3));
subplot(428)
histogram(error3);

第一个函数是根据当前点(0,0)的左手边(0,-1)的像素值进行预测的

function error = jpg_loss_error_gray1(img)
    [row,col] = size(img);
    error = zeros(row,col);
    for i = 1:row
        for j = 1:col
            if(i == 1)
                if(j == 1)
                    predict = 0;
                else
                    predict = img(i,j-1);
                end  
            else
               predict = img(i-1,j); 
            end    
            error(i,j) = img(i,j) - predict;
        end
    end
end

第二个是函数是根据上边(0,1)的像素值进行预测

function error = jpg_loss_error_gray2(img)
    [row,col] = size(img);
    error = zeros(row,col);
    for i = 1:row
        for j = 1:col
            if(j == 1)
                if(i == 1)
                    predict = 0;
                else
                    predict = img(i-1,j);
                end  
            else
               predict = img(i,j-1); 
            end    
            error(i,j) = img(i,j) - predict;
        end
    end
end

第三个函数根据(0,-1),(-1,1),(0,1)三个像素的平均值进行预测的

function error = jpg_loss_error_gray3(img)
    [row,col] = size(img);
    error = zeros(row,col);
    for i = 1:row
        for j = 1:col
            if(i == 1 || j == 1)
                if(i ~= 1)
                    predict = img(i-1,j);
                elseif(j ~= 1)
                    predict = img(i,j-1);
                else
                    predict = 0;
                end
            else
               predict = (img(i,j-1)+ img(i-1,j) + img (i-1,j-1))/3; 
            end    
            error(i,j) = img(i,j) - predict;
        end
    end
end

四. 效果

第一行为未进行处理的图片,可以看见分布从0到255,比较散乱。
底下三行分别为三种预测方法的误差图和分布图。从数值分布角度,可以看见大部分都聚集在0附近。
在这里插入图片描述

五. 结尾

真正的JPEG无损压缩的预测算法,要比上边实现的复杂。可以通过预测边缘的存在,进一步预测当前值。总之预测的越准确,压缩的越好。

  • 1
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
JPEG-LS是一种无损/有损的图像压缩算法,其无损模式的压缩率相当优异,优于其他无损压缩算法如Lossless-JPEG、Lossless-JPEG2000、Lossless-JPEG-XR等。\[1\]无损压缩是指经过压缩和重建后的图像与原图像完全一样,没有任何损失。JPEG-LS使用了待预测像素点的最相邻的三个像素点作为预测参考点,并对预测误差值使用熵编码。\[3\]相比于传统的JPEG无损模式和JPEG-2000等算法,JPEG-LS在无损压缩方面表现出色。它在医学图像处理和处理数码相机得到的DNG原始图像等领域有广泛的应用。\[2\]\[3\] #### 引用[.reference_title] - *1* [FPGA实现JPEG-LS图像压缩,有损无损可配置,提供工程源码和技术支持](https://blog.csdn.net/qq_41667729/article/details/130122044)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [JPEGLS图像压缩算法的FPGA实现(一)压缩算法](https://blog.csdn.net/alangaixiaoxiao/article/details/106664408)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [JPEG-LS压缩算法研究](https://blog.csdn.net/sunlinju/article/details/51859886)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值