JPEG2000图像压缩算法学习

这篇具有很好参考价值的文章主要介绍了JPEG2000图像压缩算法学习。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

压缩算法——JPEG2000 编解码原理
JPEG2000-Matlab源码实现

JPEG和JPEG2000

JPEG2000和JEPG都是静止图像压缩标准,最大区别是在空间域至频域转换。JPEG是基于离散余弦变换(DCT), 而JEPG2000是基于离散小波变换(DWT)。JPEG2000是JPEG的升级版,其压缩率比JPEG高约30%左右,同时支持有损和无损压缩。JPEG2000格式一个极其重要的特征在于它能实现渐进传输,即先传输图像的轮廓,然后逐步传输数据,不断提高图像质量,让图像由朦胧到清晰显示。在有损压缩下,JPEG2000一个比较明显的优点就是没有JPEG压缩中的马赛克失真效果

JPEG2000 编码算法源于 David Taubman 提出的 EBCOT 算法,使用小波变换,采用了两层编码策略,对压缩位流进行分层组织,不仅提高了压缩效率,而且压缩码流具有较大的灵活性.

JPEG2000编解码原理

jpeg2000,图像处理,学习,matlab,算法
JPEG2000 的编码系统由七个主要模块组成,在JPEG2000 编码过程中,首先是对原始图像进行离散小波变换,根据用户要求对变换后小波系数进行量化;量化后的小波系数划分为小的数据单元——码块,然后对每个码块进行独立的嵌入式编码;并将得到的所有码块的嵌入式位流,按照率失真最优原则分层组织,形成不同质量的层.对每一层,按照一定的码流格式打包,输出压缩码流.下面介绍各部分的作用及基本原理.

数据预处理及图像分量变换

jpeg2000,图像处理,学习,matlab,算法

图像分块与拼接

与JPEG 不同,JPEG 2000 算法并不需要将图像强制分成8 × 8 的小块.但为了降低对内存的需求和方便压缩域中可能的分块处理,可以将图像分割成若干互不重叠的矩形块(tile)分块的大小任意,可以整个图像是一个块,也可以一个像素是一个块.

数据偏移和归一化处理

分量变换

指对具有多个分量的图像先经过某种变换来降低各分量之间的相关性.将传统的RGB(红绿蓝)色域转换至其他色彩空间

小波变换

图像的二维离散小波分解和重构过程如图所示,分解过程可描述为:首先对图像的每一行进行1D-DWT,获得原始图像在水平方向上的低频分量L 和高频分量H,然后对变换所得数据的每一列进行1D-DWT,获得原始图像在水平和垂直方向上的低频分量LL、水平方向上的低频和垂直方向上的高频LH、水平方向上的高频和垂直方向上的低频HL 以及水平和垂直方向上的的高频分量HH.重构过程可描述为:首先对变换结果的每一列进行以为离散小波逆变换,再对变换所得数据的每一行进行一维离散小波逆变换,即可获得重构图像.由上述过程可以看出,图像的小波分解是一个将信号按照低频和有向高频进行分离的过程,分解过程中还可以根据需要对得到的LL 分量进行进一步的小波分解,直至达到要求.
jpeg2000,图像处理,学习,matlab,算法
在JPEG 2000 的核心编码系统中,对有损压缩采用的是基于Daubechies 9/7 滤波器之提升实现的不可逆DWT.对无损压缩采用的则是基于Le Gall 5/3 滤波器之提升实现的可逆DWT.JPEG 2000 标准支持基于卷积(convolution-based) 和基于提升(lifting-based) 两种滤波模式.

MQ 二值算术编码

二进制算术编码是算术编码中的一种特殊情况.JPEG2000 所用的MQ 算术编码器属于自适应二进制算术编码器,它是指编码系统用来划分区间的当前符号概率估计是可以根据已经传输和编码的信息串调整的.

JPEG2000-MatLab实现

db97_re.m
function [c]=db97_re(image,T)
c=image;
for i=1:3
    x=image(:,:,i);
   [sa,sb]=size(x); 
% t1=liftwave('9.7'); % 获取提升系数(MATLAB7.0以后) 
d1=[-1.586100000000000e+000,-1.586134342069360e+000];
p1=[1.079600000000000e+000,-5.298011857188560e-002];
d2=[-8.829110755411875e-001,-8.829110755411875e-001];
p2=[4.435068520511142e-001,1.576123746148364e+000];
d3=-8.698644516247808e-001;
p3=-1.149604398860242e+000;
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%分解层数确定
% 采用用户输入和自动给出最大层数两种方法 N=length(x); % 矩阵大小
N=length(x);
S=N; % 变量
s=log2(N); % 最大循环次数
n1=N/2; % 初始一半矩阵大小
n2=N; % 初始矩阵大小
u=0; % 初始值 % 对非2的整数幂大小图像确定最大分解层数
% 6.提升法反变换 else
n2=N/(2.^(T-1)); % 分解最小子块维数
n1=n2/2;
for time=1:T; % 行反变换

% 去归一
x([1:n1],:)=x([1:n1],:)/p3;
x([n1+1:n2],:)=x([n1+1:n2],:)/d3; % 反p;
x(n1,:)=x(n1,:)-p2(2)*x(n1+1,:)-p2(1)*x(n1+2,:);
x(n1-1,:)=x(n1-1,:)-p2(2)*x(n2,:)-p2(1)*x(n1+1,:);
x([1:n1-2],:)=x([1:n1-2],:)-p2(2)*x([n1+2:n2-1],:)-p2(1)*x([n1+3:n2],:);

% 反d;
x(n1+1,:)=x(n1+1,:)-d2(2)*x(n1,:)-d2(1)*x(1,:);
x([n1+2:n2],:)=x([n1+2:n2],:)-d2(2)*x([1:n1-1],:)-d2(1)*x([2:n1],:);

% 反p;
x1(1,:)=x(1,:)-p1(2)*x(n2,:)-p1(1)*x(n1+1,:);
x1([2:n1],:)=x([2:n1],:)-p1(2)*x([n1+1:n2-1],:)-p1(1)*x([n1+2:n2],:);

% 反d;
x(n2,:)=x(n2,:)-d1(2)*x1(n1,:)-d1(1)*x1(1,:);
x([2:2:n2-2],:)=x([n1+1:n2-1],:)-d1(2)*x1([1:n1-1],:)-d1(1)*x1([2:n1],:);

% 偶数
x([1:2:n2-1],:)=x1([1:n1],:);

clear x1;

% 列反变换

% 归一
x(:,[1:n1])=x(:,[1:n1])/d3;
x(:,[n1+1:n2])=x(:,[n1+1:n2])/p3; % 反d;
x(:,n1+1)=x(:,n1+1)+p2(1)*x(:,n1-1)+p2(2)*x(:,n1);
x(:,n1+2)=x(:,n1+2)+p2(1)*x(:,n1)+p2(2)*x(:,1);
x(:,[n1+3:n2])=x(:,[n1+3:n2])+p2(1)*x(:,[1:n1-2])+p2(2)*x(:,[2:n1-1]);

% 反p;
x(:,n1,:)=x(:,n1)+d2(1)*x(:,n2)+d2(2)*x(:,n1+1);
x(:,[1:n1-1])=x(:,[1:n1-1])+d2(1)*x(:,[n1+1:n2-1])+d2(2)*x(:,[n1+2:n2]);

% 反d;
x(:,n2)=x(:,n2)+p1(1)*x(:,n1)+p1(2)*x(:,1);
x(:,[n1+1:n2-1])=x(:,[n1+1:n2-1])+p1(1)*x(:,[1:n1-1])+p1(2)*x(:,[2:n1]);

% 反p;
x1(:,1)=x(:,1)+d1(1)*x(:,n2)+d1(2)*x(:,n1+1);
x1(:,[2:n1])=x(:,[2:n1])+d1(1)*x(:,[n1+1:n2-1])+d1(2)*x(:,[n1+2:n2]); % 奇偶
x(:,[2:2:n2])=x(:,[n1+1:n2]);
x(:,[1:2:n2-1])=x1(:,[1:n1]); clear x1;

n2=n2*2; % 原大小
n1=n2/2; % 一半大小 end;
end;
c(:,:,i)=x;
end
end
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

EBCOT.m
function [FLength,FCtxt,x_new]=EBCOT(filename,numOfBlocks,x)
%% function EBCOT.m
% Description:
% 该函数用于对数据块进行嵌入式编码
% filename:输入的数据块,大小要求为64*64的整型
% numOfBlocks:数据块的个数
% x:待存储码流的文件
% FLength:记录编码长度信息的文件
% FCtxt:记录上下文信息的文件
% x_new:存储码流后的文件
%%
% 初始化
sign=cell(numOfBlocks,1);       % 符号集
significant=cell(numOfBlocks,1);% 重要性集
refinement=cell(numOfBlocks,1); % 细化编码集
Block=cell(numOfBlocks,1);      % 码块
FCtxt=cell(numOfBlocks,1);
FLength=cell(numOfBlocks,1);

% 开始编码,对每个码块依次处理
for nb=1:numOfBlocks
    widthBlock=filename.width;
    heightBlock=filename.height;
    level=filename.level;
    subband=filename.subband;
    Block{nb}=filename.data; % data should be 64*64 and integer
    [~,x_new]=InitializeWrite(x);   % 对存储码流的文件进行初始化
    FCtxt{nb}=[];
    FLength{nb}=[];
    
    sign{nb}=zeros(heightBlock,widthBlock);
    significant{nb}=zeros(heightBlock,widthBlock);
    refinement{nb}=zeros(heightBlock,widthBlock);
    
    % 对符号集进行赋值,并将数据集全部取为正数
    [h,v]=find(Block{nb}<0);
    for i=1:length(h)
        sign{nb}(h(i),v(i))=1;
    end
    Block{nb}=abs(Block{nb});
    maximum=max(max(Block{nb}));
    
    % 通过位与操作获取位平面数
    numOfPlanes=1;
    for i=32:-1:1
        if bitand(maximum,bitshift(1,i-1))>0
            numOfPlanes=i;
            break;
        end
    end
    encoded=cell(numOfPlanes,1);    % 记录每个位置是否已编码

    % 创建位平面
    planeOfBits=cell(numOfPlanes,1);
    for i=1:numOfPlanes
        planeOfBits{i}=bitand(Block{nb},bitshift(1,i-1))>0;
    end
    
    % 开始编码
    FLength{nb}(end+1)=widthBlock;
    FLength{nb}(end+1)=heightBlock;
    FLength{nb}(end+1)=level;
    FLength{nb}(end+1)=subband;
    FLength{nb}(end+1)=numOfPlanes;
    
    for n=numOfPlanes:-1:1
        % 记录每个通道已扫描的个数
        bitsPropagation=0;
        bitsRefinement=0;
        bitsCleaning=0;
        bitsGenProp=0;
        bitsGenRef=0;
        bitsGenClea=0;
        encoded{n}=zeros(heightBlock,widthBlock);
        
       %% start propagation
        for k=1:4:heightBlock
            for j=1:widthBlock
                for i=k:k+3
                    [y,h,v,d]=GetSignificantNeighbors(...
                        significant{nb},widthBlock,heightBlock,i,j);    % 获取邻居的重要性信息
                    if ~significant{nb}(i,j) && y                       % 判断自身是否重要
                        if planeOfBits{n}(i,j)
                            x_new=WriteBit(1,x_new);                    % 向文件中写入1
                            FCtxt{nb}(end+1)=Context(h,v,d,subband);    % 记录上下文信息
                            x_new=WriteBit(sign{nb}(i,j),x_new);        % 写入该位置的符号
                            [FCtxt{nb}(end+1),~,~]=ContextSign(h,v,significant{nb},sign{nb});   % 记录符号上下文信息
                            bitsGenProp=bitsGenProp+4;
                        else
                            x_new=WriteBit(0,x_new);                    % 向文件写入0
                            FCtxt{nb}(end+1)=Context(h,v,d,subband);    % 记录上下文信息
                            bitsGenProp=bitsGenProp+2;
                        end
                        encoded{n}(i,j)=1;                              % 标记为已编码
                        bitsPropagation=bitsPropagation+1;
                    end
                end
            end
        end
        
       %% start refinement
        for k=1:4:heightBlock
            for j=1:widthBlock
                for i=k:k+3
                    if ~encoded{n}(i,j) && significant{nb}(i,j)         % 判断是否已编码以及当前位置的重要性
                        x_new=WriteBit(planeOfBits{n}(i,j),x_new);      % 向文件写入当前所在位平面的数值
                        if refinement{nb}(i,j)
                            context=16;                                 % 上下文信息记为16
                            [y,~,~,~]=GetSignificantNeighbors(...
                                significant{nb},widthBlock,heightBlock,i,j);    % 获取邻居的重要性信息
                        else if y
                                context=15;                             % 上下文信息记为15
                            else
                                context=14;                             % 上下文信息记为14
                            end
                            refinement{nb}(i,j)=1;                      % 当前位置记为已通过细化编码扫描
                        end
                        FCtxt{nb}(end+1)=context;                       % 记录上下文信息
                        encoded{n}(i,j)=1;                              % 记为已编码
                        bitsGenRef=bitsGenRef+2;
                        bitsRefinement=bitsRefinement+1;
                    end
                end
            end
        end
        %% start clean
        for k=1:4:heightBlock
            for j=1:widthBlock
                for i=k:k+3
                    if ~encoded{n}(i,j)
                        if planeOfBits{n}(i,j)
                            x_new=WriteBit(1,x_new);
                            [y,h,v,d]=GetSignificantNeighbors(...
                                significant{nb},widthBlock,heightBlock,i,j);
                            FCtxt{nb}(end+1)=Context(h,v,d,subband);
                            x_new=WriteBit(sign{nb}(i,j),x_new);
                            [FCtxt{nb}(end+1),~,~]=ContextSign(h,v,...
                                significant{nb},sign{nb});              % 记录符号上下文信息
                            significant{nb}(i,j)=1;                     % 该位置的重要性记为1
                            bitsGenClea=bitsGenClea+4;
                        else
                            x_new=WriteBit(0,x_new);
                            [y,h,v,~]=GetSignificantNeighbors(...
                                significant{nb},widthBlock,heightBlock,i,j);
                            [FCtxt{nb}(end+1),~,~]=ContextSign(h,v,...
                                significant{nb},sign{nb});
                            bitsGenClea=bitsGenClea+2;
                        end
                        bitsCleaning=bitsCleaning+1;
                    end
                end
            end
        end
        % 记录各通道的编码个数
        FLength{nb}(end+1)=idivide(int32(bitsPropagation),int32(256));
        FLength{nb}(end+1)=mod(bitsPropagation,256);
        FLength{nb}(end+1)=idivide(int32(bitsRefinement),int32(256));
        FLength{nb}(end+1)=mod(bitsRefinement,256);
        FLength{nb}(end+1)=idivide(int32(bitsCleaning),int32(256));
        FLength{nb}(end+1)=mod(bitsCleaning,256);
    end
    x_new=EndWriting(x_new);    % 结束写入信息
end
end

jpeg2000,图像处理,学习,matlab,算法文章来源地址https://www.toymoban.com/news/detail-600939.html

到了这里,关于JPEG2000图像压缩算法学习的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • FPGA实现JPEG-LS图像压缩,有损无损可配置,提供工程源码和技术支持

    JPEG-LS(简称JLS)是一种无损/有损的图像压缩算法,其无损模式的压缩率相当优异,优于 Lossless-JPEG、Lossless-JPEG2000、Lossless-JPEG-XR、FELICES 等。 本设计使用system verilog语言设计了一个JPEG-LS图像压缩加速器,输入数据为8位的灰度图,输出数据为JPEG-LS图像压缩后的16位数据,集成

    2024年02月03日
    浏览(43)
  • Baumer工业相机堡盟工业相机如何通过BGAPI SDK使用JPEG图像压缩功能(C++)

    Baumer工业相机堡盟相机是一种高性能、高质量的工业相机,可用于各种应用场景,如物体检测、计数和识别、运动分析和图像处理。 Baumer的万兆网相机拥有出色的图像处理性能,可以实时传输高分辨率图像。此外,该相机还具有快速数据传输、低功耗、易于集成以及高度可扩

    2024年02月08日
    浏览(40)
  • 【视频编解码】M-JPEG压缩、H.264压缩 对比

    参考这篇文章:https://blog.csdn.net/qq_41248872/article/details/83590337 写的比较好,这里就不赘述了。 我们在视频传输的时候,需要压缩,常见的压缩包括: jpeg 压缩 h264 压缩 当然使用最多的还是 264, 毕竟他的压缩比高嘛。对于一些实时的场景比较有优势,但是这玩意还是得分不同的

    2024年02月22日
    浏览(51)
  • 隐写术之JPEG隐写——F5算法 & Jsteg算法

    一、问题描述 二、程序设计 1. 程序输入 2. 程序输出 3. 程序功能 三、程序实现原理 四、程序具体实现 1.模块设计 ​编辑 2.程序测试与分析 3.代码附录 五、分析总结 使用Jsteg和F5隐写算法对图像进行隐写与隐写分析 task.m:标准图像Lena.tiff,供Jsteg算法隐藏的随机数据data1和供

    2024年02月15日
    浏览(31)
  • webpack处理图片资源(jpeg,jpg,png等)

    在webpack5以前,我们处理图片资源通过 file-loader 和 url-loader 进行处理 现在 Webpack5 已经将两个 Loader 功能 内置 到 Webpack 里了,我们只需要简单配置即可处理图片资源 webpack.config.js配置 完整代码如下: 添加图片资源 使用图片资源 执行打包命令 npx webpack 效果如下: 可以看到背

    2024年02月08日
    浏览(98)
  • 数字图像处理--六、图像压缩

    目录 1.基本概念 1.1 图像压缩概念及其分类 1.2 数据冗余 1.3 图像信息的度量 1.4 图像保真度准则 (Fidelity Criteria) 1.5 图像压缩模型 2.图像压缩方法 2.1Huffman编码 消除编码冗余 2.2算术编码 (Arithmetic Coding) 消除编码冗余 2.3LZW编码 (Lempel-Ziv-Welch coding) 2.4位平面编码 2.5预测编码 预测

    2024年02月12日
    浏览(45)
  • NEFU数字图像处理(5)图像压缩编码

    图像压缩编码的过程是在图像存储或传输之前进行,然后再由压缩后的图像数据(编码数据)恢复出原始图像或者是原始图像的近似图像· 无损压缩:在压缩过程中没有信息损失,可由编码数据完全恢复出原始图像· 有损压缩:在压缩过程中有信息损失,由编码数据恢复出的

    2024年02月05日
    浏览(147)
  • 【K210+ESP8266图传上位机开发】TCP server + JPEG图像解析上位机开发

    本文章主要记录基于 【K210-ESP8266】 图传和显示的过程,上位机开发过程,系统架构和下位机开发请参考文章: 【K210-ESP8266】开发板上传图像数据到服务器并实时显示 💖 作者简介:大家好,我是喜欢记录零碎知识点的小菜鸟。😎 📝 个人主页:欢迎访问我的 Ethernet_Comm 博客

    2024年02月09日
    浏览(94)
  • 【计算机视觉】数字图像处理(六)—— 图像压缩

    (一)、图像编码技术的研究背景 1. 信息信息传输方式发生了很大的改变 通信方式的改变 文字+语音 图像+文字+语音 通信对象的改变 人与人 人与机器,机器与机器 2. 图像传输与存储需要的信息量空间 (1)彩色视频信息 对于电视画面的分辨率640 480的彩色图像,每秒30帧,

    2024年02月05日
    浏览(86)
  • 九章算法: 深度学习、强化学习、机器学习、推荐系统、图像处理、文本处理、序列处理、搜索引擎、数据分析等

    作者:禅与计算机程序设计艺术 随着计算机技术的飞速发展,人工智能和机器学习领域迎来蓬勃发展的时代,从“知识图谱”到“零售系统自动化”,人工智能技术正在改变着社会生活的方方面面。传统的人工智能技术都依赖于硬件上的复杂计算能力,如神经网络、决策树等

    2024年02月08日
    浏览(62)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包