一种将边缘和平面分别放大的画面滤镜实现

A@NAZOrip
A@NAZOrip 2023年09月06日
  • 在其它设备中阅读本文章

随便写点东西...

处理过程分为7步:

  1. 通过边缘查找滤镜分离出所有的边缘纹理层
    • 线条宽度超过1像素时,会因为"过粗"而被视为两个边缘,中间是平面或斜面,不参与边缘本身的计算
      Step 1A
    • 最短边缘长度的倍数阈值限制为边缘宽度的1.5x,默认2x,从而过滤掉噪声
    • jpeg压缩会让边缘查找滤镜给出不均匀的边缘,所以将中断3像素以内的边缘视为连续
  2. 将1的结果做副本,然后通过双立方或Lanczos滤镜放大到用户指定的倍数
  3. 将原图通过双立方,Lanczos或点对点滤镜放大到用户指定的倍数
    • 一般情况下,由于要保留斜面,所以默认不能使用点对点滤镜
  4. 从3中减去2,空出的区域用距离最近像素的值填充,如果两边相同则选择右侧
    • "填充"通过一种特殊的"近邻算法"实现. 区别是空像素的搜索半径只有1像素,8个方向,如果搜索不到则暂时放到待查找队列尾,然后继续下一个空白像素的搜索
  5. 将1中的边缘纹理层做矢量化处理,并放大到用户指定的倍数
    • 放大过程中的纹理宽度限制在1像素,和原始查找边缘所得的宽度一致
  6. 将5的结果对照1的同位边缘宽度并缩窄至和1一致
  7. 任何边缘块间的空白分别以前后两个边缘块,只在起点-终点宽度相等的空白间进行线性插值
    • 用户决定精度为像素或子像素
    • 只要放大倍数在2x以内,就不需要考虑边缘起点-终点间是否要进行曲线轨迹插值
    • 如果放大倍数超过2x,则:
      • 运行取样迁就偏移SAO滤镜扫描1来确定曲线轨迹,但可能会造成性能损失
      • 线性插值可能不再适用,而是根据SAO滤镜的结果进行某种非线性渐变插值

RGB平面(解码状态)的适用性:

  • 小部分步骤只需要执行一次,大部分步骤需要在RGB三个平面上各执行一次

YCbCr平面(压缩状态)的适用性:

  • 比RGB平面速度更快,主要是因为得益于YCbCr的格式特性
  • CbCr平面可以通过γ的边缘信息进行缩放,从而减少内存占用
  • 理论上可以其实且画质更好地从4:2:0算出4:4:4,即直接用于视频播放过程的预处理部分
    • 取决于屏幕和分辨率大小

视频的适用性:

  • 理论上只需要亮度层的信息
  • 理论上只需要一张I帧的信息作为整个GOP的边缘建模,P帧,Pyramid-B帧中的I块则需要重做

矢量化:

  • 将图形作为一种形状而不是像素点表示

缺陷:

  • 需要透明/Alpha通道
  • 由于其边界宽度不变的特性,可能不适用于用于缩小图像
  • 和其它缩放算法一样,并不适合像素画,直接用点对点/无插值临近像素滤镜即可
  • 矢量化本身对性能损耗较大,分离边缘后虽然极大地降低了计算复杂度,但可能并不能实时的处理

那么就这样