抗锯齿下采样(Anti-aliasing/down-sampling)-python-numpy 实现

抗锯齿下采样(Anti-aliasing/down-sampling)-python-numpy 实现

这篇内容会涉及:卷积和抗锯齿下采样。代码请访问:https://github.com/LonglongaaaGo/ComputerVision

问题描述

如果直接对图片进行上采样,比如说用nearest 线性插值,我们能够发现上采样的图片会有很多锯齿,如上篇 从Nearest插值到Bilinear插值的分析与python实现
其实如果直接进行下采样,也会出现这个问题,效果如图所示:

抗锯齿下采样(Anti-aliasing/down-sampling)-python-numpy 实现
上图,左边是原图(小修沟),右边是下采样后的图。为了看清区别,我特意对其放大处理(不然太小了看不见)。可以看到右边明显有很厉害的锯齿。

; 抗锯齿下采样(Anti-aliasing/down-sampling)

我们肯定希望是下采样的结果也尽可能平滑,因为那样子看起来更美观。所以就有一种技术叫抗锯齿下采样(Anti-aliasing/down-sampling),这个技术也比较简单,就是两个流程:
1.首先先对图片进行box filter,得到较为平滑的图片。
2. 对平滑的图片进行下采样。

卷积

抗锯齿下采样(Anti-aliasing/down-sampling)-python-numpy 实现
卷积的计算如上图所示(图片来自),简单来讲就是我们设定好一个滤波核,然后这个滤波核从左上角到右下角进行移动,并且得到的点赋值到新的特征图上。可以看到就是简单的加权求和。

; box filter

抗锯齿下采样(Anti-aliasing/down-sampling)-python-numpy 实现
在此基础上,(图片来自),我们设定好一个box filter, 就是用来normalize 这个N × M N \times M N ×M 的区域。 意思就是假设我们设定一个N × M N \times M N ×M大小的 filter(或者叫kernel),每个单元就是值为1 N × M \frac{\mathbb{1}}{N \times M}N ×M 1 ​的标量。

下采样

最后就是滤波完之后下采样,可以直接Nearest插值,对尺寸都缩放到原来的1/2 即可。具体方法可以访问上篇 从Nearest插值到Bilinear插值的分析与python实现

最终效果

抗锯齿下采样(Anti-aliasing/down-sampling)-python-numpy 实现
最终效果如图所示,左边是未经过抗锯齿的结果,右边是经过抗锯齿的结果。可以发现右边的结果明显平滑很多,也没有了锯齿。

具体实现细节,可以看看代码,非常好理解。

抗锯齿下采样(Anti-aliasing/down-sampling)-python-numpy 实现

Original: https://blog.csdn.net/Willen_/article/details/123159364
Author: Longlongaaago
Title: 抗锯齿下采样(Anti-aliasing/down-sampling)-python-numpy 实现

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/759406/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球