JPEG编码会丢失信息。但是JPEG解码通过用噪声填充丢失的信息来引入伪影。
左下角:采用GIMP的4:2:0色度子采样以10%质量编码的JPEG,64x64细节。
左下:采用GIMP的4:4:4色度子采样以90%质量编码的JPEG,64x64细节。
jpeg2png是用可移植的C编写的,特别是C11。它依赖于libjpeg和libpng,您可以使用GNU make和GCC或Clang编译可执行文件。执行以下其中一项。
jpeg2png为不应另存为JPEG的图片提供最佳效果。例如,图表、徽标和卡通样式的数字绘图。
另一方面,对于照片或其他纹理精细的图片,jpeg2png的效果很差。
jpeg2png查找编码为给定JPEG文件的尽可能平滑的图片。但是什么是平滑?第一个近似值是总方差,它说平滑度是相邻像素之间差异的总和。这很有效,但它可以产生非常尖锐的过渡。0 1 2 3 4和0 0 0 4 4的总变异均为4。
我们需要的不只是看差异,还要看差异的差异,这就是所谓的全广义变差[1]。0 1 2 3 4的差值之和为0,0 0 0 4 4的差值之和为4。
为了将一阶差和和二阶差和结合起来,我们选择一个权w,那么0 1 2 3 4的总光滑度为4+w*0,0 0 0 4的总光滑度为4+w*4。
jpeg2png允许您使用-w参数选择二阶差之和的权重。
纯粹为了平滑而优化有时可能会太过分。如果我们平滑0 3 3..。3 3 0,最大偏差0.5,结果为0.5 2.5。2.5 2.5 0.5整个内部块以一种不太可能的方式改变以适应边界。在真实图片中,这可以被视为亮度或颜色的轻微改变。为了防止这种情况,我们还以非常小的权重优化DCT系数的最小偏差平方和。
jpeg2png允许您使用-p参数选择偏差平方和的权重。
现在我们知道我们要找的是什么了。但是如何找到它呢?原来这是一个非线性的凸优化问题,我们使用的方法是一步一步地使解码变得更平滑,步数越多,解码就越平滑。
较少的步骤,例如10步,只需要几秒钟。质量可能会更好,但与常规解码相比,已经很好了。
步骤很多,比如1000步,可能只需要几分钟,质量非常好,但是这么高的数字可能是矫枉过正。
JPEG编码类似于将颜色转换为YCbCr->;色度子采样->;分块DCT->;量化-&>舍入-&>熵编码
标准的JPEG解码类似于熵解码->;去量化->;分块IDCT->;色度上采样->;将颜色转换为RGB。
解码过程中缺少的关键一步是反转取整。当然取整不是一对一可逆的,但是我们可以将x解舍入到区间[x-0.5,x+0.5]。这就给出了一组可能的图像。
我们的目标是最小化sum i=1 to n(范数(梯度(U_I)+w*sum i=1 to n(范数(梯度(U_I)+p*sum(DCT(u-Original)/quant)^2)。为了得到目标TV项的梯度,我们使用前向差分。范数是欧几里得范数。对于二阶TGV项,我们使用后向差作为第二梯度,给出一个2x2的Hessian矩阵。也就是说,我们平均dxdy和dydx。这里的范数是Frobenius标准。我们不使用任何高阶TGV项。偏差由量化因子归一化。我们不区分直流系数和交流系数的偏差。
不幸的是,如果其中一个范数为零,我们的目标的梯度就没有定义,所以我们的目标是不光滑的,当范数为零时选择的次导数为0。
目标是凸的,我们的搜索空间Q也是凸的,因为DCT是正交的,所以我们可以很容易地投影到我们的搜索空间上。所以我们可以进行离散余弦变换,将偏差投影到方框[-0.5,+0.5]^n上,然后对其进行独立变换。
综上所述,我们使用投影和Fista加速的次梯度法,选择的步长为半径(Q)/sqrt(1+步数),其中半径(Q)为sqrt(N)/2。
让它并行得更快(OpenMP)不确定最终是否值得花费时间,但当--分离-组件是唯一的模式时,这是有意义的。
不能将电视翻转到平行的地方:C版本(双核)加速1.15倍(分支并行电视)
最终,进度条比将时间从40秒提高到18秒更重要。
我相信这可能是他2004年的一本书的草稿,但它是一种惊人的不道德行为。这是一个坚实的基础,组织得很好,有清晰的解释和充分的证据。强烈推荐。
电视目标,用次梯度法和投影的凸优化,回想起来都很明显,这是我想出来后发现的,但它仍然是一本很好的书。
在此基础上,考虑了二次采样、TGV、原始-对偶等算法。宣传材料[视频][演示文稿][至]。
这是DCT偏差模型的来源。误差的均匀分布足够接近,即使β=1/2的广义正态分布更接近实际。我忽略了HMRF的东西,因为我发现Huber功能非常特别和不雅致。
qjpegrest是一个工具,可以让你尝试许多不同的JPEG恢复方法(基于电视、基于带通和基于Huber MRF)。我从代码中学到了一些东西。有关安装帮助,请参阅Notes/qjpegrest.txt。
本程序是自由软件:您可以根据自由软件基金会发布的GNU通用公共许可证的条款、许可证的第三版或(根据您的选择)任何更高版本对其进行再分发和/或修改。
分发本程序的目的是希望它有用,但没有任何担保;甚至没有对适销性或是否适用于特定目的的默示担保。有关更多详细信息,请参阅GNU通用公共许可证。
您应该已经收到了GNU通用公共许可证的副本以及此程序。如果没有,请参阅http://www.gnu.org/licenses/.