Games101学习笔记二(锯齿、模糊等失真的本质)
文章目录
- Aliasing
- Antialiasing思路
- 采样前模糊
- 从频域分析抗锯齿的本质
- 滤波等于去掉高频信息
- 滤掉低频部分
- 滤掉高频部分
- 高频低频都滤掉
- 滤波等于卷积也等于平均
- 采样等于重复频率内容
- Aliasing等于混掉了频率内容
- Antialiasing
- Antialiased Sampling
- Antialiasing By Supersampling (MSAA)
- 现在成熟的方案
- 引用
内容参考来自闫令琪老师的课程,有兴趣的同学可以去看完整课程
Aliasing
在计算机图形学中,很多失真(artifact)都是由于采样,比如
- Jaggies – sampling in space (在空间采样不够)
- Moire – undersampling images (图像欠采样)
- Wagon wheel effect – sampling in time (在时间上欠采样)
Signals are changing too fast (high frequency), but sampled too slowly
究其根本就是信号是高频的,但是采样率不够。
Antialiasing思路
采样前模糊
红色的三角形光栅化采样的时候,由于硬切边,所以最后采样后的结果buffer中会出现jaggies.
但是如果在Sample之前做一次滤波,那么最终的效果会好很多。
从频域分析抗锯齿的本质
转换到频域后,我们可以看到高频部分完全是欠采样的
而欠采样则会导致频域失真,因为重构出来的图像损失了原来的高频信息
滤波等于去掉高频信息
Filtering = Getting rid of certain frequency content
贴出opencv的傅里叶变换的demo
import cv2 as cv
import numpy as np
from matplotlib import pyplot as plt
img = cv.imread('messi5.jpg',0)
f = np.fft.fft2(img)
fshift = np.fft.fftshift(f)
magnitude_spectrum = 20*np.log(np.abs(fshift))
plt.subplot(121),plt.imshow(img, cmap = 'gray')
plt.title('Input Image'), plt.xticks([]), plt.yticks([])
plt.subplot(122),plt.imshow(magnitude_spectrum, cmap = 'gray')
plt.title('Magnitude Spectrum'), plt.xticks([]), plt.yticks([])
plt.show()
通过快速傅里叶变化,我们把频域振幅展示出来
滤掉低频部分
rows, cols = img.shape
crow,ccol = rows//2 , cols//2
for r in range(rows):for c in range(cols):if(np.sqrt((r - crow)*(r - crow)+(c - ccol)*(c - ccol)) < 50):fshift[r,c] = 0f_ishift = np.fft.ifftshift(fshift)
img_back = np.fft.ifft2(f_ishift)
img_back = np.real(img_back)plt.figure(2)
plt.subplot(121),plt.imshow(img_back, cmap = 'gray')
plt.title('Image after HPF'), plt.xticks([]), plt.yticks([])
plt.subplot(122),plt.imshow(20*np.log(np.abs(fshift)), cmap = 'gray')
plt.title('Magnitude Spectrum'), plt.xticks([]), plt.yticks([])
plt.show()
则只剩下边缘
滤掉高频部分
fshift2 = fshift
for r in range(rows):for c in range(cols):if(np.sqrt((r - crow)*(r - crow)+(c - ccol)*(c - ccol)) >= 50):fshift2[r,c] = 0f_ishift = np.fft.ifftshift(fshift2)
img_back = np.fft.ifft2(f_ishift)
img_back = np.real(img_back)plt.figure(3)
plt.subplot(121),plt.imshow(img_back, cmap = 'gray')
plt.title('Image after LPF'), plt.xticks([]), plt.yticks([])
plt.subplot(122),plt.imshow(20*np.log(np.abs(fshift2)), cmap = 'gray')
plt.title('Magnitude Spectrum'), plt.xticks([]), plt.yticks([])
plt.show()
则会变得模糊
高频低频都滤掉
fshift3 = fshift
for r in range(rows):for c in range(cols):dis = np.sqrt((r - crow)*(r - crow)+(c - ccol)*(c - ccol))if(dis >= 50 or dis < 20):fshift3[r,c] = 0f_ishift = np.fft.ifftshift(fshift3)
img_back = np.fft.ifft2(f_ishift)
img_back = np.real(img_back)plt.figure(4)
plt.subplot(121),plt.imshow(img_back, cmap = 'gray')
plt.title('Image after LPF'), plt.xticks([]), plt.yticks([])
plt.subplot(122),plt.imshow(20*np.log(np.abs(fshift3)), cmap = 'gray')
plt.title('Magnitude Spectrum'), plt.xticks([]), plt.yticks([])
plt.show()
滤波等于卷积也等于平均
Filtering = Convolution (= Averaging)
时域的卷积等于频域的乘积
所以为了去掉高频信息,我们有两种选择
- 在时域进行卷积
- 先用傅里叶变换转换到频域
- 再在频域与傅里叶变换后的卷积核相乘
- 把结果通过反傅里叶变换转换回时域
从图中可以看到方形滤波器就是一个低通滤波器,直接与图片做卷积,只保留了低频的信息,所以图片变模糊了。
而且我们可以看到方波滤波器在频域是Sinc函数的形式,会有震荡,在球谐分析中,我们也遇到了类似的问题,处理方案就是不要使用硬切边的核函数。
采样等于重复频率内容
Sampling = Repeating Frequency Contents
The evolution of sampling theorem. (a) The time domain of the band-limited signal and (b) the frequency spectrum with band width of f 0 ; © The time domain signal of the sampled function and (d) the frequency spectrum with repetition of f s ; (e) and (f) the time domain signal and the frequency spectrum of the obtained signal, respectively. |
---|
Aliasing等于混掉了频率内容
Antialiasing
减少失真的方法
1、增加采样率
- 增加频域中采样实例的距离
- 使用更大的分辨率,包括屏幕、传感器,framebuffers等,这样更耗,而且有可能需要非常高的分辨率
2、Antialiasing - 在重复其内容前,使得傅里叶变换后的内容更加窄。比如在采样前滤掉高频信号
Antialiased Sampling
常用的滤波核,如 Box-filter
在像素域Antialiasing可以使用上面提到的核函数与图片做卷积,然后再做采样。
Antialiasing By Supersampling (MSAA)
在一个像素里面采样多个点并平均,来逼近一个像素大的 Box-filter 滤波的结果。
当然MASS的每次采样都是需要执行FragmentShader的,所以会更加的耗。
现在成熟的方案
- FXAA(Fast Approximate AA):找到边缘部分,只对边缘部分做filter
- TAA:在时间上做filter
引用
[1]https://sites.cs.ucsb.edu/~lingqi/teaching/resources/
[2]https://docs.opencv.org/master/de/dbc/tutorial_py_fourier_transform.html
Games101学习笔记二(锯齿、模糊等失真的本质)相关推荐
- GAMES101 学习笔记 Lecture 1~6
目录 GAMES101 学习笔记 Lecture 1~6 往期作业汇总帖 Lecture 01 Overview of Computer Graphics 笔记参考 其他教程 怎么判断一个画面是否优秀 ...
- Mongodb使用学习笔记(二)
文章目录 Mongodb使用学习笔记(二)之查询篇 1. MongoDB命令学习 (1) MongoDB 查询文档 1.1 全部查询 1.2 单条件查询 1.3 多条件查询 1.3.1 AND拼接多条 ...
- [GAMES101学习笔记] 角度与立体角
[GAMES101学习笔记] 角度与立体角 FesianXu 2020/09/16 at UESTC 前言 本系列文章是笔者学习GAMES101 [1]过程中的学习笔记,如有谬误请联系指出,转载请注明 ...
- qml学习笔记(二):可视化元素基类Item详解(上半场anchors等等)
原博主博客地址:http://blog.csdn.net/qq21497936 本文章博客地址:http://blog.csdn.net/qq21497936/article/details/7851 ...
- [转载]dorado学习笔记(二)
原文地址:dorado学习笔记(二)作者:傻掛 ·isFirst, isLast在什么情况下使用?在遍历dataset的时候会用到 ·dorado执行的顺序,首先由jsp发送请求,调用相关的ViewM ...
- PyTorch学习笔记(二)——回归
PyTorch学习笔记(二)--回归 本文主要是用PyTorch来实现一个简单的回归任务. 编辑器:spyder 1.引入相应的包及生成伪数据 import torch import torch.nn ...
- tensorflow学习笔记二——建立一个简单的神经网络拟合二次函数
tensorflow学习笔记二--建立一个简单的神经网络 2016-09-23 16:04 2973人阅读 评论(2) 收藏 举报 分类: tensorflow(4) 目录(?)[+] 本笔记目的 ...
- Scapy学习笔记二
Scapy学习笔记二 Scapy Sniffer的用法: http://blog.csdn.net/qwertyupoiuytr/article/details/54670489 Scapy Snif ...
- Ethernet/IP 学习笔记二
Ethernet/IP 学习笔记二 原文链接:http://wiki.mbalib.com/wiki/Ethernet/IP 1.通信模式 不同于源/目的通信模式,EtherNet/IP 采用生产/消 ...
最新文章
- C++调用openssl使用sha256,并取结果前64位作为uint64
- 根据企业信息化应用需求来分析工作流平台的选型
- 爬虫神器:一条命令下载《复仇者联盟3:无限战争》
- .NET 工具生成引擎概述
- 【图像处理】图像灰度级减少, 图像缩放(Reducing the Number of Gray Levels, Zooming and Shrinking)
- Ubuntu 17安装Virtual Box
- 宝塔Linux面板公司,宝塔面板_宝塔Linux面板-九州数码,一站式云安全服务平台
- 【论文写作】综述论文的六个写作模版
- 《Android 第1行代码》读后感—第11章【Android 特色开发——基于位置的服务】
- 如何将CAD图纸转换成彩色jpg
- iOS 判断当前键盘为九宫格
- python后台开发性能问题_《Python高性能编程》——2.14 确保性能分析成功的策略-阿里云开发者社区...
- 微信小程序输入联想、表格
- 35+的测试人都去哪儿了?所谓“青春饭”真的只是在贩卖焦虑吗?
- 小程序第三方微信授权登录的实现
- 敏感词过滤案例(Filter过滤器)
- 基于ns2和ns3进行AODV协议改进仿真
- Ubuntu16.04笔记本 安装R RStudio
- 图片压缩怎么在线处理?如何压缩图片大小kb?
- Docker | 基于docker安装Redis