【GAD翻译馆】细剖HQX缩放过滤器.docxVIP

  1. 1、本文档共10页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  5. 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  6. 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  7. 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  8. 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
【GAD翻译馆】细剖HQX缩放过滤器 翻译:赵菁菁(轩语轩缘)审校:李笑达(DDBC4747) HQX过滤器,也叫hq2x,hq3x和hq4x,是著名的像素艺术,主要是旧的控制台(如NES)模拟器使用这些过滤器,用于提供流畅的游戏渲染,由Maxim Stepin于2003年左右开发完成。 目前有更好的像素艺术放大算法,比如xBR。微软也做了一些研究去生产另一个缩放器。HQX一直都是稳定的参照对象,曾在FFmpeg bug跟踪器上被请求。我决定仔细研究一下我们能否实现。毕竟我们已经有Super2xSaI了,人们看来挺喜欢编码他们相当规模的旧学校视频游戏会话记录的想法。 不幸的是,参考代码超过展开C代码的12.000行。在每一个项目中,这个代码基本上没有重复。而且,似乎没有人对算法有任何了解。我不想在FFmpeg重现该错误。 关于过滤器的常识 ??????让我们开始了解这些滤波器的常识。有3个过滤器拥有类似的算法:hq2x,hq3x和hq4x,分别以2, 3和4倍比例输入图像。没有时间插值,只是个一比一的帧缩放。 ????? 3种算法都在当前像素周围使用一个3x3区域,用于确定使用的插值。因此,对于每个像素,构建一个8位模式:算法会检查周围8个像素中的每一个是否与当前像素(中心)存在差异。这种差异采用YUV阈值定义:亮度48,?蓝色色度7,红色色度6:如果一个平面上的一个差异是在阈值之上,在模式中该位将为1,否则为0。 ??????然后展开代码。基本上,代码有几千个switch-case结构,8位模式的所有256个组合。采用不同的插值方法,每种情况都有代码填充一个2x2(hq2x),3x3(hq3x)或4x4的块(hq4x)。有每像素10次插值,它们实际上是带有不同因子的2或3像素插值。 这就是我们知道的关于算法本身的全部。 首次尝试 起初我很天真,我认为通过使用C预处理器来减少行数是可能的。毕竟,代码是非常冗余的。这是一个巨大的错误,我在这浪费了大量的时间。我可能保存了像3000或4000行的东西,但是我在过程中碰了几次壁。通常,在某些模式情况下,存在额外的差异条件,这些条件不存储在模式中(switch-case结构会更大……),这些条件也是是非常复杂的东西。 所以我想真正理解算法,手动地。就像,你知道,有笔和纸。我为一些模式这么做是为了深入了解,但这是一个非常缓慢的过程,它实际上并没有帮助我很多。 hq2x的可视化表示形式 ??????那么,我们有了hq2x,?3个过滤器中最简单的。我们知道对于一个像素,会产生2x2的块。我们可以安心假设一个像素的算法与其他三个带有一些对称性的像素的算法是一样的。 ??????对于10种插值方法有256种模式。表示一个方法是检查触发每个插值的全部模式是什么。 ??????所以我写了一些Python代码,为的是从参考代码提取我所需要的全部信息,我用Cairo来表示: ??????在左边(蓝色渐变的3x3块),是当右边组合之一匹配时选择的插值。蓝色更多意味着系数更重要,白色意味着系数不太重要。中心点是当前的那个。 右边的是各种触发插值的不同组合的列表: 当像素是红色时,意味着必须与当前像素(中心)有视觉上的差异。 当一个像素是黑色的就意味着必须与当前像素没有视觉上的差异。记住,接近其他黑色像素的中心像素也是黑色。 当呈现时,绿线连接2个像素,这些像素必须有视觉上的差异(除了所有其他以红色表示视觉差异的情况)。 这些绿色行对应于我们在原始代码中一些模式案例中发现的额外的if检查。这里警告一下:我们只显示if为真情况,这意味着其他情况不显示。因此,这些绿色行必须在无条件的任何模式之前处理。 在各种情况下,我们可以观察到组合中的通用模式。例如,对于第一个插值(实际上不是,我们只选择当前像素),我们可以用一些“可选”差异区分相同的模式。 不幸的是,分解组合并不像听起来那么容易。为了确定像素值是否会影响选定的插值,我使用了一个非常愚蠢和缓慢的算法,可以总结为下面的伪代码: 1 2 3 4 5 6 对于一个给定插值: ??????每一个组合互相比较: ????????确定两者间的差异 ????????生成所有需要在子集中满足的组合,假设它们是可选的组合 ????????如果可以发现所有的组合,把模式添加到列表中 保存最佳的模式(基本上是除去那些存在父集的模式) 所以就产生了这个: 语义和之前的图片一样,除了现在的灰色像素代表像素值不重要的像素。 从中获取代码 现在这张最新图片可以很容易翻译成代码。我们必须遵守两条规则: 确保优先处理内部存在差异的情况(绿色划线)。 先处理简单情况,这样一来插值的最大值就可以被if的最小值覆盖了。它还允许有一个最后的else分支,该分支不需要覆盖大多数条件下的插值。 你会得

您可能关注的文档

文档评论(0)

187****6278 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档