翘首以盼的抗锯齿

Antialiasing

实际的图形学中是怎么实现反走样的呢?

我们不希望实际产出的图形有锯齿效果,那怎么办呢?

06fdde0120ff4b10b8382294479640bc.png

从采样的理论开始谈起吧 

Simpling theory

照片也是一种采样,把景象打散成像素放到屏幕上的过程:

9952d87c436040e4ac2145087fd29437.png

还可以在不同的时间(视频):

272da95e35814a6c97b3e1f3bf009cfc.png

 动画是定义在帧数上的

一个专业术语:Artifacts(瑕疵)

采样会产生很多问题,一个是锯齿:

b50e8204e72241589ddf39bd76711e93.png

还有问题比如说摩尔纹:

dc1451b6590e4724ae9dc31f87a8d43c.png

它怎么产生的呢?

 比如说把左边的奇数行奇数列都去掉变成小图,显示成和大图一样大,就能看到摩尔纹了(拿手机拍电脑显示器)

还有一种有意思的叫车轮效应,也是采样中出现的问题,比如人肉眼的采样速度跟不上高速旋转的物体:

6b3c2dc4fdd54addaa0c21deb03de848.png

我们如何反走样呢?

在采样之前做一个模糊(滤波),做一个模糊再采样就可以反走样:

 2b257c213daf49a287aa0bdef6a6e06a.png

d6d6b0f41c144d05adb178c102df534c.png

注意顺序是不能颠倒的,要先模糊再采样,如果先采样再模糊就变成了Blurred Aliasing:

9cd27af2f07e497696799203b1013178.png 那为什么采样的速度跟不上信号变换的速度就会走样?

Antialiasing in practice

Frequency Domain

先来看看频率吧:

f9c0fb9ce108460cb893a0a58b975e2c.png

调整前面的系数会得到不同的余弦波(频率不同) 

介绍正余弦波:

d3920e2a7baf465596ee1c2fcff63bda.png

为了介绍傅里叶级数展开(任何周期函数可以将其写成正余弦函数的线性组合)

还有个东西叫傅里叶变换:

c99a0ff7c92a414c8ed2b777bca86891.png

傅里叶变换:把函数变成不同频率的段并且显示出来:

64b12b35bb8d49e09c9f9bcfd6df205a.png 采样还原出的函数在不同频率下有出入,走样本质是信号变化的太快导致采样跟不上

 时域相乘,频域卷积,必须要到达两倍才不会走样

b0a8b08442f54108a4acebe365c71520.png

上面的结果就是采样两种频率完全不同的信号但是采样结果完全一样!

 这就是走样。

Filtering

把某个特定的频率给抹掉,说出对应信号如何变化

傅里叶变换就是从时域变到频域:

27c5158195f94a93ba1afc3a4fb6dcf0.png

 中心把其定义成低频的区域,周围全都是高频的区域,在不同频率的信息多少通过亮度表示

信息多集中在低频段

水平和竖直方向有道,我们在分析信号的时候我们会认为它是周期性重复的信号,那么对于不周期性重复的信号怎么办呢?

比如上图哪里重复了,并不重复对吧,我们通过右边界在重复左边界的内容,在边界会产生剧烈的变化从而产生极其高的高频,头顶位置和衣服下边缘位置的图像变化剧烈,导致高频区域为白色

滤波是去掉一些频率的内容,把低频信号抹掉,高频信号有意义:图像内容的边界

687f916495fc4d32a48906e67ab82b10.png

这种滤波叫高通滤波 (通过滤波器使只有高频的滤波可通过)

为什么高频信息就对应边界呢?

是不是变化很剧烈的才叫边界?

那就是高频信息呀,我们如果过滤掉高频只留下低频呢?

a416f17a78e34218a99add2139b4cddb.png

会发现边界模糊勒 

还可以做另外的实验:去掉高频。去掉低频,留下中庸之道,就可以提取到一些不是很明显的边界特征(中通滤波):

5bc40c182eed4e97bc4f64ee136d0255.png

卷积(Convolution)和滤波有关系,本质是一种点乘:

4fd0d143595e4a59935ee9e013badac8.png

这是要做一个卷积操作(加权平均):

7e46c9f66c2e48ea8a2408679e65e135.png

卷积定理: 时域卷积等于频域相乘,在时域上的乘积相当于在频域上的卷积:

29bd8929930c46a7b94e535ed931c9dc.png

1d14176bfb8242308d5cb929ddcbfa41.png

 卷积操作进行均值模糊,时域的卷积等于频域的乘积

滤波器本身是一个3×3的盒子,再×eq?%5Cfrac%7B1%7D%7B9%7D是为了不让图像整体的颜色值发生变化:

9b8904cab66a459cb8e8d9a423023f8b.png

 上面的例子显示出的结果是这个盒子是一个低通滤波器

bba02e0dc5b3421994d157bc40680891.png

时域上的一个小格子转换成频域,如果盒子在时域上变大了,那在频域上该如何变化呢?

盒子在时域上变大,反而在频域上变小:

9702e794d2634d618f186698dd1c44c3.png

 用越大的box做卷积会越来越模糊,如果用一个超级小的box就相当于根本没有做滤波,也就是说所有东西都被留了下来

采样是什么?是在重复频域上的内容(×另外一个函数):

d81836510fa24e6eb20e99457a07a78d.png

根据卷积定理,时域上的乘积对应到频域上为卷积,时域卷积等于频域乘积

采样就是在重复原始信号的频谱

1、左侧一列的中间是一个周期冲激序列,它在t=nT上纵坐标为无穷大,且频域(右中)仍是一个冲激序列,若用其与原信号相乘进行采样,采样的过程就不是让左边上中两图简单相乘就行了,它需要再进行一个过程将其转化为离散时间序列

2、实际采样时一个常用的办法是用一个在t=nT上纵坐标为1的采样序列乘信号源,这样可以直接得到采样信号

3、右上和右中卷积得到右下是可证的

为什么会产生走样就很显然了:采样的不同间隔会引起频谱以另外一个不同的间隔移动:

9bd0dc2fbb574112a7505f961fe3dcdc.png

 采样不够快,冲击函数频率低,卷积结果频率低(原始信号和复制粘贴的信号重合在一起了:发生走样,频谱搬移发生混合)

提升分辨率走样就会好很多(进行多的采样)

Reduce Alising

怎么改善走样呢?

052ab591386845a6a3458c8b175432f1.png

1.提高分辨率

2.先去模糊再去采样(模糊:低通滤波):

d1efd7ed0bb74310ae4a4a6b2beb6cb4.png

e4f54afed9644ba3a245dc940106d311.png 那么在实际的操作中,我们采用什么样的滤波器来进行卷积操作呢?

用一定大小的低通滤波器对其进行卷积:

07b7215b996146199b75bf29815c1954.png

 对像素覆盖的面积求平均:

27b2b40d0f3a44dd9a40a9bdc27b4d24.png

MSAA 

对更多采样点进行反走样(对反走样的近似,不能严格意义上解决反走样的问题),对大覆盖的点的近似:

18dc03b1cd43479095ffe36b7e87f78b.png

cc12082c4a31447eadeb2c30359a6d9d.png 

028ba31ba6304e08b10fb8a03bbccfca.png 

d09aa9ffb07049a89b0ae46935f0276f.png 

通过更多的样本进行反走样的第一步:模糊

 676864ff15fc47598a13ce2f1ee2020b.png

 MSAA是采样时提升了计算精度:

df2c91dd8fc449c68941c55ae88b1cd8.png

05a5a744f48c49f1a8a180ae2618a084.png 

通过增大计算量抗锯齿,还有其他抗锯齿的方法:FXAA(Fast Approximate AA:替换成没有锯齿的边界)、TAA(Temporal AA:找上一帧的信息)

Tips:Super resolution,超分辨率,把小图放大看到的全是锯齿,怎样把采样不够的图变得没有锯齿呢?可以通过深度学习的方法:DLSS(猜测)

Visibility/occlusion

首先需要谈的问题就是关于可见性,很直观的一种想法是先画远处的物体,再画近处的物体(把远处的物体遮挡住),由远到近做光栅化:(Painter's Algorithm)画家算法:

555ac0251ef74c2ab944998019f9a944.png

但是想要定义深度并不简单,需要光栅化排序:

da204d864e344033ac52f835b911a1b7.png

上面这种复杂的情况在深度上存在互相遮挡的关系,也就没办法用亲爱的画家算法,为了解决这个问题,在图形学中引入了一个概念:Z-Buffering

Z-Buffering

深度缓冲84144df9616640509bd52144d7ada7e6.png

 对三角形的覆盖关系不好判断,但是可以面向像素排序,记录像素离我们比较近的距离

最后得到的结果是要渲染出一幅画面:

cd2f42a7ce4f4a2b909567eabae90c14.png

这两幅图永远都是同时生成的,那算法在一开始的时候该如何进行呢?

看像素的具体情况,更新最浅深度:

ac623824a9b94441a2f66c1d5443adb1.png

深度缓存工作实例:

cec161338af1479eababbeafbf69b4a7.png 

涂新颜色、更新最小深度值 

深度缓存算法有一个好处:与顺序无关,不会有两个浮点数的值完全一样(出现深度完全一样的情况),深度缓存算法被广泛的应用于图形学

f68362e6eebb49b7bddfc6f794100c21.png

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/685167.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

stm32 定时器输出比较(OC)与PWM的理解和应用

不积跬步,无以至千里;不积小流,无以成江海。大家好,我是闲鹤,公众号 xxh_zone,十多年开发、架构经验,先后在华为、迅雷服役过,也在高校从事教学3年;目前已创业了7年多&am…

盛夏之约,即将启程,2024中国北京消防展将于6月26举行

盛夏之约,即将启程,2024中国北京消防展将于6月26举行 盛夏之约,即将启程!备受瞩目的2024中国(北京)消防技术与设备展览会将于6月26-28 日在北京.首钢会展中心盛大召开。作为消防安全和应急救援的年度盛会&…

DDMA信号处理以及数据处理的流程---DDMA原理介绍

Hello,大家好,我是Xiaojie,好久不见,欢迎大家能够和Xiaojie一起学习毫米波雷达知识,Xiaojie准备连载一个系列的文章—DDMA信号处理以及数据处理的流程,本系列文章将从目标生成、信号仿真、测距、测速、cfar…

LeetCode790多米诺和托米诺平铺

题目描述 有两种形状的瓷砖:一种是 2 x 1 的多米诺形,另一种是形如 “L” 的托米诺形。两种形状都可以旋转。给定整数 n ,返回可以平铺 2 x n 的面板的方法的数量。返回对 109 7 取模 的值。平铺指的是每个正方形都必须有瓷砖覆盖。两个平铺…

【教程】从0开始搭建大语言模型:文本预处理

从0开始搭建大语言模型:文本预处理 参考仓库:LLMs-from-scratch 理解Word embedding 深度神经网络模型,包括LLM,不能直接处理原始文本,因此需要一种方法将它转换为连续值的向量,也就是embedding。如下图…

【YOLOV8】1.开发环境搭建

Yolo8出来一段时间了,包含了目标检测、实例分割、人体姿态预测、旋转目标检测、图像分类等功能,所以想花点时间总结记录一下这几个功能的使用方法和自定义数据集需要注意的一些问题,本篇是第一篇,开发环境的配置。 YOLO(You Only Look Once)是一种流行的物体检测和图像分割…

UE4_Ben_图形52_水下效果处理

学习笔记,不喜勿喷,欢迎指正,侵权立删!祝愿生活越来越好! 在这个后期处理的效果中,我们可以看到有很多不同的,这里有浓雾,波纹扭曲,镜头扭曲和边缘模糊,在第4…

Linux中安装Docker,并使用Docker安装MySQL和Redis

1、安装docker 1卸载系统之前的docker yum remove docker \docker-client \docker-client-latest \docker-common \docker-latest \docker-latest-logrotate \docker-logrotate \docker-engine2、安装Docker-CE #安装必须的依赖 sudo yum install -y yum-utils \device-map…

抽象,自定义函数,递归

6.1懒惰是一种美德 如果你 在一个地方编写了一些代码,但需要在另一个地方再次使用,该如何办呢? 假设你编写了一段代码,它计算一些斐波那契数(一种数列,其中每个数都是前两个数的和)。 现在的…

Freeswitch-soundtouch-变声开发

文章目录 一、介绍二、安装soundtouch2.1 源码安装方式(推荐)2.1.1下载源码2.1.2解压2.1.3 编译2.1.4 迁移(可选) 2.2 apt-get 安装 三、使用3.1 终端使用3.2 Freeswitch使用3.2.1编译Freeswitch的mod_soundtouch3.2.2启用 mod_so…

Qt图像处理技术九:得到QImage图像的灰度直方图

效果 原理 得到灰度化值&#xff0c;将灰度化的值带入0-255内&#xff0c;增加&#xff0c;得到可视化图形 源码 // 绘制直方图 QImage drawHistogram(const QImage &image) {QVector<int> histogram(256, 0);// 计算图像的灰度直方图for (int y 0; y < image…

static的用法

static一般用于修饰局部变量&#xff0c;全局变量&#xff0c;函数 1 static修饰局部变量 是因为改为static int a1;后&#xff0c;出了作用域&#xff0c;不会销毁a的值&#xff0c;想要理解其本质&#xff0c;首先先看一下这个图&#xff1a; static修饰局部变量时&#xf…

【代码随想录】【算法训练营】【第30天】 [322]重新安排行程 [51]N皇后 [37]解数独

前言 思路及算法思维&#xff0c;指路 代码随想录。 题目来自 LeetCode。 day 30&#xff0c;周四&#xff0c;好难&#xff0c;会不了一点~ 题目详情 [322] 重新安排行程 题目描述 322 重新安排行程 解题思路 前提&#xff1a;…… 思路&#xff1a;回溯。 重点&…

yolo水果品质:新鲜腐烂橙子检测/分类数据集(3k+图像全标注)

yolo水果品质检测之新鲜腐烂橙子数据集&#xff0c;整个数据集共包含3852张图像&#xff0c;yolo标注完整&#xff08;txt格式&#xff09;,标注类别分为新鲜橙子&#xff08;0&#xff09;和腐烂橙子&#xff08;1&#xff09;两类 图像统一格式&#xff1a;jpg 图像统一分辨…

windows10子系统wsl ubuntu22.04下GN/ninja环境搭建

打开windows10子系统 ubuntu22.04 ubuntu22.04: 首先需要 安装ninja $sudo apt install ninja-build $ ninja --version 1.10.0 安装clang $sudo apt install clang $clang --version Ubuntu clang version 14.0.0-1ubuntu1.1安装gn Github: https://github.com/timniederh…

ar地产沙盘互动体验提供更加丰富多彩的楼盘信息

AR增强现实技术作为其重要分支&#xff0c;正逐步在全球市场中崭露头角。国内的AR增强现实技术公司正致力于链接物理世界和虚拟世界&#xff0c;为用户带来沉浸式的AR体验。它们打造线上线下联动的一站式文旅景区数字化运营平台&#xff0c;让您在享受旅游的同时&#xff0c;也…

什么是Vector Database(向量数据库)?

什么是Vector Database(向量数据库)&#xff1f; 向量数据库是向量嵌入的有组织的集合&#xff0c;可以随时创建、读取、更新和删除。向量嵌入将文本或图像等数据块表示为数值。 文章目录 什么是Vector Database(向量数据库)&#xff1f;什么是嵌入模型(Embedding Model)&…

用蒙特卡罗积分法近似求解定积分的值及举例

一、背景知识 1、连续随机变量的概率密度函数 对于连续型随机变量的概率密度函数&#xff08;PDF&#xff09;&#xff0c;其在整个定义域上的积分必须等于1。这是概率密度函数的一个基本属性&#xff0c;它确保了随机变量取任何值的概率之和等于1&#xff0c;符合概率论的公…

家用洗地机哪个牌子好?专家推荐榜单助你挑选最合适的洗地机

随着科技不断发展&#xff0c;智能家居产品逐渐融入我们日常生活中&#xff0c;洗地机作为家庭清洁必备工具&#xff0c;越来越受到消费者青睐&#xff0c;但是面对市面上种类繁多的洗地机&#xff0c;我们如何挑选到适合自己的产品呢&#xff1f;专家推荐榜单助你挑选最合适的…

在vue项目中使用markdown-it回显markdown文本

前言 其实有很多插件都是可以用来回显markdown文本的,这个插件也是其中之一。 文档地址:markdown-it | markdown-it 中文文档 这个文档在vue2和vue3里面都可以使用,所以还是比较推荐的 使用 安装 npm install markdown-it --save 应用 <template><div><…