import{_ as d,c as a,b as Q,a as m,d as n,o as t}from"./app-DZszAu6D.js";const l="/images/2014/08/jpeg_036.gif",r={},s={class:"MathJax",jax:"SVG",display:"true",style:{position:"relative"}},H={style:{"vertical-align":"-9.904ex"},xmlns:"http://www.w3.org/2000/svg",width:"66.157ex",height:"20.769ex",role:"img",focusable:"false",viewBox:"0 -4802.5 29241.3 9180","aria-hidden":"true"},o={class:"MathJax",jax:"SVG",display:"true",width:"full",style:{"min-width":"53.359ex",position:"relative"}},e={style:{"vertical-align":"-2.194ex","min-width":"53.359ex"},xmlns:"http://www.w3.org/2000/svg",width:"100%",height:"5.519ex",role:"img",focusable:"false","aria-hidden":"true"},V={class:"MathJax",jax:"SVG",display:"true",style:{position:"relative"}},h={style:{"vertical-align":"-19.197ex"},xmlns:"http://www.w3.org/2000/svg",width:"49.43ex",height:"39.525ex",role:"img",focusable:"false",viewBox:"0 -8985 21848.2 17470","aria-hidden":"true"},p={class:"MathJax",jax:"SVG",display:"true",width:"full",style:{"min-width":"54.914ex",position:"relative"}},g={style:{"vertical-align":"-8.71ex","min-width":"54.914ex"},xmlns:"http://www.w3.org/2000/svg",width:"100%",height:"18.552ex",role:"img",focusable:"false","aria-hidden":"true"},L={class:"MathJax",jax:"SVG",display:"true",style:{position:"relative"}},M={style:{"vertical-align":"-0.566ex"},xmlns:"http://www.w3.org/2000/svg",width:"47.215ex",height:"2.262ex",role:"img",focusable:"false",viewBox:"0 -750 20869.1 1000","aria-hidden":"true"},Z={class:"MathJax",jax:"SVG",display:"true",style:{position:"relative"}},c={style:{"vertical-align":"-8.558ex"},xmlns:"http://www.w3.org/2000/svg",width:"33.658ex",height:"18.077ex",role:"img",focusable:"false",viewBox:"0 -4207.5 14876.7 7990","aria-hidden":"true"};function f(u,T){return t(),a("div",null,[T[12]||(T[12]=Q("h1",{id:"jpeg算法解密-三",tabindex:"-1"},[Q("a",{class:"header-anchor",href:"#jpeg算法解密-三"},[Q("span",null,"JPEG算法解密(三)")])],-1)),T[13]||(T[13]=Q("h3",{id:"步骤四-数据量化",tabindex:"-1"},[Q("a",{class:"header-anchor",href:"#步骤四-数据量化"},[Q("span",null,"步骤四:数据量化")])],-1)),T[14]||(T[14]=Q("hr",null,null,-1)),T[15]||(T[15]=Q("p",null,"经过上一节介绍的离散余弦变换,图像数据虽然已经面目全非,但仍然是处于“可逆”的状态,也就是说我们还没有进入“有损”的那一步。这次我们来玩真的,看一下数据中的细节是如何被滤去的。先来考察一下要对付的问题是什么,经过颜色空间转换和离散余弦变换,每一个8X8的图像块都变成了三个8X8的浮点数矩阵,分别表示Y,Cr,Cb数据,比如以其中某个亮度数据矩阵举例,它的数据如下",-1)),Q("mjx-container",s,[(t(),a("svg",H,T[0]||(T[0]=[m('',1)]))),T[1]||(T[1]=Q("mjx-assistive-mml",{unselectable:"on",display:"block"},[Q("math",{xmlns:"http://www.w3.org/1998/Math/MathML",display:"block"},[Q("mstyle",{mathsize:"0.85em"},[Q("mrow",{"data-mjx-texclass":"ORD"},[Q("mi",null,"G"),Q("mo",null,"="),Q("mrow",{"data-mjx-texclass":"INNER"},[Q("mo",{"data-mjx-texclass":"OPEN"},"["),Q("mtable",{columnspacing:"1em",rowspacing:"4pt"},[Q("mtr",null,[Q("mtd",null,[Q("mo",null,"−"),Q("mn",null,"415.38")]),Q("mtd",null,[Q("mo",null,"−"),Q("mn",null,"30.19")]),Q("mtd",null,[Q("mo",null,"−"),Q("mn",null,"61.20")]),Q("mtd",null,[Q("mn",null,"27.24")]),Q("mtd",null,[Q("mn",null,"56.12")]),Q("mtd",null,[Q("mo",null,"−"),Q("mn",null,"20.10")]),Q("mtd",null,[Q("mo",null,"−"),Q("mn",null,"2.39")]),Q("mtd",null,[Q("mn",null,"0.46")])]),Q("mtr",null,[Q("mtd",null,[Q("mn",null,"4.47")]),Q("mtd",null,[Q("mo",null,"−"),Q("mn",null,"21.86")]),Q("mtd",null,[Q("mo",null,"−"),Q("mn",null,"60.76")]),Q("mtd",null,[Q("mn",null,"10.25")]),Q("mtd",null,[Q("mn",null,"13.15")]),Q("mtd",null,[Q("mo",null,"−"),Q("mn",null,"7.09")]),Q("mtd",null,[Q("mo",null,"−"),Q("mn",null,"8.54")]),Q("mtd",null,[Q("mn",null,"4.88")])]),Q("mtr",null,[Q("mtd",null,[Q("mo",null,"−"),Q("mn",null,"46.83")]),Q("mtd",null,[Q("mn",null,"7.37")]),Q("mtd",null,[Q("mn",null,"77.13")]),Q("mtd",null,[Q("mo",null,"−"),Q("mn",null,"24.56")]),Q("mtd",null,[Q("mo",null,"−"),Q("mn",null,"28.91")]),Q("mtd",null,[Q("mn",null,"9.93")]),Q("mtd",null,[Q("mn",null,"5.42")]),Q("mtd",null,[Q("mo",null,"−"),Q("mn",null,"5.65")])]),Q("mtr",null,[Q("mtd",null,[Q("mo",null,"−"),Q("mn",null,"48.53")]),Q("mtd",null,[Q("mn",null,"12.07")]),Q("mtd",null,[Q("mn",null,"34.10")]),Q("mtd",null,[Q("mo",null,"−"),Q("mn",null,"14.76")]),Q("mtd",null,[Q("mo",null,"−"),Q("mn",null,"10.24")]),Q("mtd",null,[Q("mn",null,"6.30")]),Q("mtd",null,[Q("mn",null,"1.83")]),Q("mtd",null,[Q("mn",null,"1.95")])]),Q("mtr",null,[Q("mtd",null,[Q("mn",null,"12.12")]),Q("mtd",null,[Q("mo",null,"−"),Q("mn",null,"6.55")]),Q("mtd",null,[Q("mo",null,"−"),Q("mn",null,"13.20")]),Q("mtd",null,[Q("mo",null,"−"),Q("mn",null,"3.95")]),Q("mtd",null,[Q("mo",null,"−"),Q("mn",null,"1.87")]),Q("mtd",null,[Q("mn",null,"1.75")]),Q("mtd",null,[Q("mo",null,"−"),Q("mn",null,"2.79")]),Q("mtd",null,[Q("mn",null,"3.14")])]),Q("mtr",null,[Q("mtd",null,[Q("mo",null,"−"),Q("mn",null,"7.73")]),Q("mtd",null,[Q("mn",null,"2.91")]),Q("mtd",null,[Q("mn",null,"2.38")]),Q("mtd",null,[Q("mo",null,"−"),Q("mn",null,"5.94")]),Q("mtd",null,[Q("mo",null,"−"),Q("mn",null,"2.38")]),Q("mtd",null,[Q("mn",null,"0.94")]),Q("mtd",null,[Q("mn",null,"4.30")]),Q("mtd",null,[Q("mn",null,"1.85")])]),Q("mtr",null,[Q("mtd",null,[Q("mo",null,"−"),Q("mn",null,"1.03")]),Q("mtd",null,[Q("mn",null,"0.18")]),Q("mtd",null,[Q("mn",null,"0.42")]),Q("mtd",null,[Q("mo",null,"−"),Q("mn",null,"2.42")]),Q("mtd",null,[Q("mo",null,"−"),Q("mn",null,"0.88")]),Q("mtd",null,[Q("mo",null,"−"),Q("mn",null,"3.02")]),Q("mtd",null,[Q("mn",null,"4.12")]),Q("mtd",null,[Q("mo",null,"−"),Q("mn",null,"0.66")])]),Q("mtr",null,[Q("mtd",null,[Q("mo",null,"−"),Q("mn",null,"0.17")]),Q("mtd",null,[Q("mn",null,"0.14")]),Q("mtd",null,[Q("mo",null,"−"),Q("mn",null,"1.07")]),Q("mtd",null,[Q("mo",null,"−"),Q("mn",null,"4.19")]),Q("mtd",null,[Q("mo",null,"−"),Q("mn",null,"1.17")]),Q("mtd",null,[Q("mo",null,"−"),Q("mn",null,"0.10")]),Q("mtd",null,[Q("mn",null,"0.50")]),Q("mtd",null,[Q("mn",null,"1.68")])])]),Q("mo",{"data-mjx-texclass":"CLOSE"},"]")])])])])],-1))]),T[16]||(T[16]=Q("p",null,"我们的问题是,在可以损失一部分精度的情况下,如何用更少的空间存储这些浮点数?答案是使用量子化(Quantization),简称量化。“量子”这个概念来自于物理学,意思是说连续的能量可以看做是一个个单元体的组合,很简单,比如游戏中在处理角色面朝方向时,往往不是使用0到2π这样的32bit浮点数,而是把方向分成16个区间,用0到16这样的整数来表示,这样只用4个bit就足够了。JPEG提供的量子化算法如下:",-1)),Q("mjx-container",o,[(t(),a("svg",e,T[2]||(T[2]=[m('',1)]))),T[3]||(T[3]=Q("mjx-assistive-mml",{unselectable:"on",display:"block"},[Q("math",{xmlns:"http://www.w3.org/1998/Math/MathML",display:"block"},[Q("mtable",{displaystyle:"true"},[Q("mlabeledtr",null,[Q("mtd",null,[Q("mtext",null,"(3.1)")]),Q("mtd",null,[Q("msub",null,[Q("mi",null,"B"),Q("mrow",{"data-mjx-texclass":"ORD"},[Q("mi",null,"i"),Q("mo",null,","),Q("mi",null,"j")])]),Q("mo",null,"="),Q("mi",null,"r"),Q("mi",null,"o"),Q("mi",null,"u"),Q("mi",null,"n"),Q("mi",null,"d"),Q("mrow",{"data-mjx-texclass":"INNER"},[Q("mo",{"data-mjx-texclass":"OPEN"},"("),Q("mfrac",null,[Q("msub",null,[Q("mi",null,"G"),Q("mrow",{"data-mjx-texclass":"ORD"},[Q("mi",null,"i"),Q("mo",null,","),Q("mi",null,"j")])]),Q("msub",null,[Q("mi",null,"Q"),Q("mrow",{"data-mjx-texclass":"ORD"},[Q("mi",null,"i"),Q("mo",null,","),Q("mi",null,"j")])])]),Q("mo",{"data-mjx-texclass":"CLOSE"},")")]),Q("mstyle",{scriptlevel:"0"},[Q("mspace",{width:"1em"})]),Q("mi",null,"i"),Q("mo",null,","),Q("mi",null,"j"),Q("mo",null,"="),Q("mn",null,"0"),Q("mo",null,","),Q("mn",null,"1"),Q("mo",null,","),Q("mn",null,"2"),Q("mo",null,","),Q("mo",null,"⋯"),Q("mo",null,","),Q("mn",null,"7")])])])])],-1))]),T[17]||(T[17]=Q("p",null,"其中G是我们需要处理的图像矩阵,Q称作量化系数矩阵(Quantization matrices),JPEG算法提供了两张标准的量化系数矩阵,分别用于处理亮度数据Y和色差数据Cr以及Cb。",-1)),Q("mjx-container",V,[(t(),a("svg",h,T[4]||(T[4]=[m('',1)]))),T[5]||(T[5]=Q("mjx-assistive-mml",{unselectable:"on",display:"block"},[Q("math",{xmlns:"http://www.w3.org/1998/Math/MathML",display:"block"},[Q("mtable",{displaystyle:"true",columnalign:"right left",columnspacing:"0em",rowspacing:"3pt"},[Q("mtr",null,[Q("mtd",null,[Q("msub",null,[Q("mi",null,"Q"),Q("mrow",{"data-mjx-texclass":"ORD"},[Q("mi",null,"l"),Q("mi",null,"u"),Q("mi",null,"m"),Q("mi",null,"i"),Q("mi",null,"n"),Q("mi",null,"a"),Q("mi",null,"n"),Q("mi",null,"c"),Q("mi",null,"e")])])]),Q("mtd",null,[Q("mi"),Q("mo",null,"="),Q("mstyle",{mathsize:"0.85em"},[Q("mrow",{"data-mjx-texclass":"ORD"},[Q("mrow",{"data-mjx-texclass":"INNER"},[Q("mo",{"data-mjx-texclass":"OPEN"},"["),Q("mtable",{columnalign:"center",columnspacing:"1em",rowspacing:"4pt"},[Q("mtr",null,[Q("mtd",null,[Q("mn",null,"16")]),Q("mtd",null,[Q("mn",null,"11")]),Q("mtd",null,[Q("mn",null,"10")]),Q("mtd",null,[Q("mn",null,"16")]),Q("mtd",null,[Q("mn",null,"24")]),Q("mtd",null,[Q("mn",null,"40")]),Q("mtd",null,[Q("mn",null,"51")]),Q("mtd",null,[Q("mn",null,"61")])]),Q("mtr",null,[Q("mtd",null,[Q("mn",null,"12")]),Q("mtd",null,[Q("mn",null,"12")]),Q("mtd",null,[Q("mn",null,"14")]),Q("mtd",null,[Q("mn",null,"19")]),Q("mtd",null,[Q("mn",null,"26")]),Q("mtd",null,[Q("mn",null,"58")]),Q("mtd",null,[Q("mn",null,"60")]),Q("mtd",null,[Q("mn",null,"55")])]),Q("mtr",null,[Q("mtd",null,[Q("mn",null,"14")]),Q("mtd",null,[Q("mn",null,"13")]),Q("mtd",null,[Q("mn",null,"16")]),Q("mtd",null,[Q("mn",null,"24")]),Q("mtd",null,[Q("mn",null,"40")]),Q("mtd",null,[Q("mn",null,"57")]),Q("mtd",null,[Q("mn",null,"69")]),Q("mtd",null,[Q("mn",null,"56")])]),Q("mtr",null,[Q("mtd",null,[Q("mn",null,"14")]),Q("mtd",null,[Q("mn",null,"17")]),Q("mtd",null,[Q("mn",null,"22")]),Q("mtd",null,[Q("mn",null,"29")]),Q("mtd",null,[Q("mn",null,"51")]),Q("mtd",null,[Q("mn",null,"87")]),Q("mtd",null,[Q("mn",null,"80")]),Q("mtd",null,[Q("mn",null,"62")])]),Q("mtr",null,[Q("mtd",null,[Q("mn",null,"18")]),Q("mtd",null,[Q("mn",null,"22")]),Q("mtd",null,[Q("mn",null,"37")]),Q("mtd",null,[Q("mn",null,"56")]),Q("mtd",null,[Q("mn",null,"68")]),Q("mtd",null,[Q("mn",null,"109")]),Q("mtd",null,[Q("mn",null,"103")]),Q("mtd",null,[Q("mn",null,"77")])]),Q("mtr",null,[Q("mtd",null,[Q("mn",null,"24")]),Q("mtd",null,[Q("mn",null,"35")]),Q("mtd",null,[Q("mn",null,"55")]),Q("mtd",null,[Q("mn",null,"64")]),Q("mtd",null,[Q("mn",null,"81")]),Q("mtd",null,[Q("mn",null,"104")]),Q("mtd",null,[Q("mn",null,"113")]),Q("mtd",null,[Q("mn",null,"92")])]),Q("mtr",null,[Q("mtd",null,[Q("mn",null,"49")]),Q("mtd",null,[Q("mn",null,"64")]),Q("mtd",null,[Q("mn",null,"78")]),Q("mtd",null,[Q("mn",null,"87")]),Q("mtd",null,[Q("mn",null,"103")]),Q("mtd",null,[Q("mn",null,"121")]),Q("mtd",null,[Q("mn",null,"120")]),Q("mtd",null,[Q("mn",null,"101")])]),Q("mtr",null,[Q("mtd",null,[Q("mn",null,"72")]),Q("mtd",null,[Q("mn",null,"92")]),Q("mtd",null,[Q("mn",null,"95")]),Q("mtd",null,[Q("mn",null,"98")]),Q("mtd",null,[Q("mn",null,"112")]),Q("mtd",null,[Q("mn",null,"100")]),Q("mtd",null,[Q("mn",null,"103")]),Q("mtd",null,[Q("mn",null,"99")])])]),Q("mo",{"data-mjx-texclass":"CLOSE"},"]")])])])])]),Q("mtr",null,[Q("mtd",null,[Q("msub",null,[Q("mi",null,"Q"),Q("mrow",{"data-mjx-texclass":"ORD"},[Q("mi",null,"c"),Q("mi",null,"h"),Q("mi",null,"r"),Q("mi",null,"o"),Q("mi",null,"m"),Q("mi",null,"i"),Q("mi",null,"n"),Q("mi",null,"a"),Q("mi",null,"n"),Q("mi",null,"c"),Q("mi",null,"e")])])]),Q("mtd",null,[Q("mi"),Q("mo",null,"="),Q("mstyle",{mathsize:"0.85em"},[Q("mrow",{"data-mjx-texclass":"ORD"},[Q("mrow",{"data-mjx-texclass":"INNER"},[Q("mo",{"data-mjx-texclass":"OPEN"},"["),Q("mtable",{columnalign:"center",columnspacing:"1em",rowspacing:"4pt"},[Q("mtr",null,[Q("mtd",null,[Q("mn",null,"17")]),Q("mtd",null,[Q("mn",null,"18")]),Q("mtd",null,[Q("mn",null,"24")]),Q("mtd",null,[Q("mn",null,"47")]),Q("mtd",null,[Q("mn",null,"99")]),Q("mtd",null,[Q("mn",null,"99")]),Q("mtd",null,[Q("mn",null,"99")]),Q("mtd",null,[Q("mn",null,"99")])]),Q("mtr",null,[Q("mtd",null,[Q("mn",null,"18")]),Q("mtd",null,[Q("mn",null,"21")]),Q("mtd",null,[Q("mn",null,"26")]),Q("mtd",null,[Q("mn",null,"66")]),Q("mtd",null,[Q("mn",null,"99")]),Q("mtd",null,[Q("mn",null,"99")]),Q("mtd",null,[Q("mn",null,"99")]),Q("mtd",null,[Q("mn",null,"99")])]),Q("mtr",null,[Q("mtd",null,[Q("mn",null,"24")]),Q("mtd",null,[Q("mn",null,"26")]),Q("mtd",null,[Q("mn",null,"56")]),Q("mtd",null,[Q("mn",null,"99")]),Q("mtd",null,[Q("mn",null,"99")]),Q("mtd",null,[Q("mn",null,"99")]),Q("mtd",null,[Q("mn",null,"99")]),Q("mtd",null,[Q("mn",null,"99")])]),Q("mtr",null,[Q("mtd",null,[Q("mn",null,"47")]),Q("mtd",null,[Q("mn",null,"66")]),Q("mtd",null,[Q("mn",null,"99")]),Q("mtd",null,[Q("mn",null,"99")]),Q("mtd",null,[Q("mn",null,"99")]),Q("mtd",null,[Q("mn",null,"99")]),Q("mtd",null,[Q("mn",null,"99")]),Q("mtd",null,[Q("mn",null,"99")])]),Q("mtr",null,[Q("mtd",null,[Q("mn",null,"99")]),Q("mtd",null,[Q("mn",null,"99")]),Q("mtd",null,[Q("mn",null,"99")]),Q("mtd",null,[Q("mn",null,"99")]),Q("mtd",null,[Q("mn",null,"99")]),Q("mtd",null,[Q("mn",null,"99")]),Q("mtd",null,[Q("mn",null,"99")]),Q("mtd",null,[Q("mn",null,"99")])]),Q("mtr",null,[Q("mtd",null,[Q("mn",null,"99")]),Q("mtd",null,[Q("mn",null,"99")]),Q("mtd",null,[Q("mn",null,"99")]),Q("mtd",null,[Q("mn",null,"99")]),Q("mtd",null,[Q("mn",null,"99")]),Q("mtd",null,[Q("mn",null,"99")]),Q("mtd",null,[Q("mn",null,"99")]),Q("mtd",null,[Q("mn",null,"99")])]),Q("mtr",null,[Q("mtd",null,[Q("mn",null,"99")]),Q("mtd",null,[Q("mn",null,"99")]),Q("mtd",null,[Q("mn",null,"99")]),Q("mtd",null,[Q("mn",null,"99")]),Q("mtd",null,[Q("mn",null,"99")]),Q("mtd",null,[Q("mn",null,"99")]),Q("mtd",null,[Q("mn",null,"99")]),Q("mtd",null,[Q("mn",null,"99")])])]),Q("mo",{"data-mjx-texclass":"CLOSE"},"]")])])])])])])])],-1))]),T[18]||(T[18]=Q("p",null,"其中round函数是取整函数,但考虑到了四舍五入,也就是说",-1)),Q("mjx-container",p,[(t(),a("svg",g,T[6]||(T[6]=[m('',1)]))),T[7]||(T[7]=Q("mjx-assistive-mml",{unselectable:"on",display:"block"},[Q("math",{xmlns:"http://www.w3.org/1998/Math/MathML",display:"block"},[Q("mtable",{displaystyle:"true"},[Q("mlabeledtr",null,[Q("mtd",null,[Q("mtext",null,"(3.2)")]),Q("mtd",null,[Q("mi",null,"r"),Q("mi",null,"o"),Q("mi",null,"u"),Q("mi",null,"n"),Q("mi",null,"d"),Q("mo",{stretchy:"false"},"("),Q("mi",null,"r"),Q("mo",{stretchy:"false"},")"),Q("mo",null,"="),Q("mrow",{"data-mjx-texclass":"INNER"},[Q("mo",{"data-mjx-texclass":"OPEN"},"{"),Q("mtable",{columnalign:"left left",columnspacing:"1em",rowspacing:".2em"},[Q("mtr",null,[Q("mtd"),Q("mtd",null,[Q("mo",null,"⋯")])]),Q("mtr",null,[Q("mtd",null,[Q("mn",null,"2")]),Q("mtd",null,[Q("mtext",null,"when "),Q("mn",null,"1.5"),Q("mo",null,"≤"),Q("mi",null,"r"),Q("mo",null,"<"),Q("mn",null,"2.5")])]),Q("mtr",null,[Q("mtd",null,[Q("mn",null,"1")]),Q("mtd",null,[Q("mtext",null,"when "),Q("mn",null,"0.5"),Q("mo",null,"≤"),Q("mi",null,"r"),Q("mo",null,"<"),Q("mn",null,"1.5")])]),Q("mtr",null,[Q("mtd",null,[Q("mn",null,"0")]),Q("mtd",null,[Q("mtext",null,"when "),Q("mo",null,"−"),Q("mn",null,"0.5"),Q("mo",null,"≤"),Q("mi",null,"r"),Q("mo",null,"<"),Q("mn",null,"0.5")])]),Q("mtr",null,[Q("mtd",null,[Q("mo",null,"−"),Q("mn",null,"1")]),Q("mtd",null,[Q("mtext",null,"when "),Q("mo",null,"−"),Q("mn",null,"1.5"),Q("mo",null,"≤"),Q("mi",null,"r"),Q("mo",null,"<"),Q("mo",null,"−"),Q("mn",null,"0.5")])]),Q("mtr",null,[Q("mtd",null,[Q("mo",null,"−"),Q("mn",null,"2")]),Q("mtd",null,[Q("mtext",null,"when "),Q("mo",null,"−"),Q("mn",null,"2.5"),Q("mo",null,"≤"),Q("mi",null,"r"),Q("mo",null,"<"),Q("mo",null,"−"),Q("mn",null,"1.5")])]),Q("mtr",null,[Q("mtd"),Q("mtd",null,[Q("mo",null,"⋯")])])]),Q("mo",{"data-mjx-texclass":"CLOSE",fence:"true",stretchy:"true",symmetric:"true"})])])])])])],-1))]),T[19]||(T[19]=Q("p",null,"比如上面数据,以左上角的-415.38为例,对应的量子化系数是16,那么",-1)),Q("mjx-container",L,[(t(),a("svg",M,T[8]||(T[8]=[m('',1)]))),T[9]||(T[9]=Q("mjx-assistive-mml",{unselectable:"on",display:"block"},[Q("math",{xmlns:"http://www.w3.org/1998/Math/MathML",display:"block"},[Q("mi",null,"r"),Q("mi",null,"o"),Q("mi",null,"u"),Q("mi",null,"n"),Q("mi",null,"d"),Q("mo",{stretchy:"false"},"("),Q("mo",null,"−"),Q("mn",null,"415.38"),Q("mrow",{"data-mjx-texclass":"ORD"},[Q("mo",null,"/")]),Q("mn",null,"16"),Q("mo",{stretchy:"false"},")"),Q("mo",null,"="),Q("mi",null,"r"),Q("mi",null,"o"),Q("mi",null,"u"),Q("mi",null,"n"),Q("mi",null,"d"),Q("mo",{stretchy:"false"},"("),Q("mo",null,"−"),Q("mn",null,"25.96125"),Q("mo",{stretchy:"false"},")"),Q("mo",null,"="),Q("mo",null,"−"),Q("mn",null,"26")])],-1))]),T[20]||(T[20]=Q("p",null,"最终得到的量化后的结果为",-1)),Q("mjx-container",Z,[(t(),a("svg",c,T[10]||(T[10]=[m('',1)]))),T[11]||(T[11]=Q("mjx-assistive-mml",{unselectable:"on",display:"block"},[Q("math",{xmlns:"http://www.w3.org/1998/Math/MathML",display:"block"},[Q("mstyle",{mathsize:"0.85em"},[Q("mrow",{"data-mjx-texclass":"ORD"},[Q("mrow",{"data-mjx-texclass":"INNER"},[Q("mo",{"data-mjx-texclass":"OPEN"},"["),Q("mtable",{columnspacing:"1em",rowspacing:"4pt"},[Q("mtr",null,[Q("mtd",null,[Q("mo",null,"−"),Q("mn",null,"26")]),Q("mtd",null,[Q("mo",null,"−"),Q("mn",null,"3")]),Q("mtd",null,[Q("mo",null,"−"),Q("mn",null,"6")]),Q("mtd",null,[Q("mn",null,"2")]),Q("mtd",null,[Q("mn",null,"2")]),Q("mtd",null,[Q("mo",null,"−"),Q("mn",null,"1")]),Q("mtd",null,[Q("mn",null,"0")]),Q("mtd",null,[Q("mn",null,"0")])]),Q("mtr",null,[Q("mtd",null,[Q("mn",null,"0")]),Q("mtd",null,[Q("mo",null,"−"),Q("mn",null,"2")]),Q("mtd",null,[Q("mo",null,"−"),Q("mn",null,"4")]),Q("mtd",null,[Q("mn",null,"1")]),Q("mtd",null,[Q("mn",null,"1")]),Q("mtd",null,[Q("mn",null,"0")]),Q("mtd",null,[Q("mn",null,"0")]),Q("mtd",null,[Q("mn",null,"0")])]),Q("mtr",null,[Q("mtd",null,[Q("mo",null,"−"),Q("mn",null,"3")]),Q("mtd",null,[Q("mn",null,"1")]),Q("mtd",null,[Q("mn",null,"5")]),Q("mtd",null,[Q("mo",null,"−"),Q("mn",null,"1")]),Q("mtd",null,[Q("mo",null,"−"),Q("mn",null,"1")]),Q("mtd",null,[Q("mn",null,"0")]),Q("mtd",null,[Q("mn",null,"0")]),Q("mtd",null,[Q("mn",null,"0")])]),Q("mtr",null,[Q("mtd",null,[Q("mo",null,"−"),Q("mn",null,"3")]),Q("mtd",null,[Q("mn",null,"1")]),Q("mtd",null,[Q("mn",null,"2")]),Q("mtd",null,[Q("mo",null,"−"),Q("mn",null,"1")]),Q("mtd",null,[Q("mn",null,"0")]),Q("mtd",null,[Q("mn",null,"0")]),Q("mtd",null,[Q("mn",null,"0")]),Q("mtd",null,[Q("mn",null,"0")])]),Q("mtr",null,[Q("mtd",null,[Q("mn",null,"0")]),Q("mtd",null,[Q("mn",null,"0")]),Q("mtd",null,[Q("mn",null,"0")]),Q("mtd",null,[Q("mn",null,"0")]),Q("mtd",null,[Q("mn",null,"0")]),Q("mtd",null,[Q("mn",null,"0")]),Q("mtd",null,[Q("mn",null,"0")]),Q("mtd",null,[Q("mn",null,"0")])]),Q("mtr",null,[Q("mtd",null,[Q("mn",null,"0")]),Q("mtd",null,[Q("mn",null,"0")]),Q("mtd",null,[Q("mn",null,"0")]),Q("mtd",null,[Q("mn",null,"0")]),Q("mtd",null,[Q("mn",null,"0")]),Q("mtd",null,[Q("mn",null,"0")]),Q("mtd",null,[Q("mn",null,"0")]),Q("mtd",null,[Q("mn",null,"0")])]),Q("mtr",null,[Q("mtd",null,[Q("mn",null,"0")]),Q("mtd",null,[Q("mn",null,"0")]),Q("mtd",null,[Q("mn",null,"0")]),Q("mtd",null,[Q("mn",null,"0")]),Q("mtd",null,[Q("mn",null,"0")]),Q("mtd",null,[Q("mn",null,"0")]),Q("mtd",null,[Q("mn",null,"0")]),Q("mtd",null,[Q("mn",null,"0")])])]),Q("mo",{"data-mjx-texclass":"CLOSE"},"]")])])])])],-1))]),T[21]||(T[21]=Q("p",null,[n("可以看到,一大部分数据变成了0,这非常有利于后面的压缩存储。这两张神奇的量化表也是有讲究的,还记得我们在第一节中所讲的有损压缩的基本原理吗,有损压缩就是把数据中重要的数据和不重要的数据分开,然后分别处理。DCT系数矩阵中的不同位置的值代表了图像数据中不同频率的分量,这两张表中的数据时人们根据人眼对不不同频率的敏感程度的差别所积累下的经验制定的,一般来说人眼对于低频的分量必高频分量更加敏感,所以两张量化系数矩阵左上角的数值明显小于右下角区域。在实际的压缩过程中,还可以根据需要在这些系数的基础上再乘以一个系数,以使更多或更少的数据变成0,我们平时使用的图像处理软件在生成jpg文件时,在控制压缩质量的时候,就是控制的这个系数。"),Q("br"),n(" 在进入下一节之前,矩阵的量化还有最后一步要做,就是把量化后的二维矩阵转变成一个一维数组,以方便后面的霍夫曼压缩,但在做这个顺序转换时,需要按照一个特定的取值顺序。")],-1)),T[22]||(T[22]=Q("figure",null,[Q("img",{src:l,alt:"",tabindex:"0",loading:"lazy"}),Q("figcaption")],-1)),T[23]||(T[23]=Q("p",null,[n("这么做的目的只有一个,就是尽可能把0放在一起,由于0大部分集中在右下角,所以才用这种由左上角到右下角的顺序,经过这种顺序变换,最终矩阵变成一个整数数组"),Q("br"),n(" -26,-3,0,-3,-2,-6,2,-4,1,-3,0,1,5,,1,2,-1,1,-1,2,0,0,0,0,0,-1,-1,0,0,0,0,…,0,0"),Q("br"),n(" 后面的工作就是对这个数组进行再一次的哈夫曼压缩,已得到最终的压缩数据。")],-1))])}const x=d(r,[["render",f],["__file","JPEG003.html.vue"]]),w=JSON.parse('{"path":"/blog/2025/02/JPEG003.html","title":"JPEG算法解密(三)","lang":"zh-CN","frontmatter":{"title":"JPEG算法解密(三)","tags":"压缩 图像 程序 算法"},"headers":[{"level":3,"title":"步骤四:数据量化","slug":"步骤四-数据量化","link":"#步骤四-数据量化","children":[]}],"git":{},"filePathRelative":"blog/2025/02/JPEG003.md"}');export{x as comp,w as data};