翘首以盼的抗锯齿

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

 

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

21 - 即时食物配送 II(高频 SQL 50 题基础版)

21 - 即时食物配送 II -- sum(if(order_datecustomer_pref_delivery_date,1,0))/count(*)sum(order_datecustomer_pref_delivery_date)/count(*) -- count(*),表示数据的行数,如果有分组,为分组后数据的行数select round(100*sum(if(order_datecustomer_…

原来Stable Diffusion是这样工作的

stable diffusion是一种潜在扩散模型,可以从文本生成人工智能图像。为什么叫做潜在扩散模型呢?这是因为与在高维图像空间中操作不同,它首先将图像压缩到潜在空间中,然后再进行操作。 在这篇文章中,我们将深入了解它到…

达摩院重大“遗产”!fluxonium量子比特初始化300纳秒且保真度超过99%

通用量子计算机开发的主要挑战之一是制备量子比特。十多年来,研究人员在构建量子计算机的过程中主要使用了transmon量子比特,这也是迄今为止商业上最成功的超导量子比特。 但与业界多数选择transmon量子比特不同,(前)…

Python文本处理利器:jieba库全解析

文章目录 Python文本处理利器:jieba库全解析第一部分:背景和功能介绍第二部分:库的概述第三部分:安装方法第四部分:常用库函数介绍1. 精确模式分词2. 全模式分词3. 搜索引擎模式分词4. 添加自定义词典5. 关键词提取 第…

服务器遭遇UDP攻击时的应对与解决方案

UDP攻击作为分布式拒绝服务(DDoS)攻击的一种常见形式,通过发送大量的UDP数据包淹没目标服务器,导致网络拥塞、服务中断。本文旨在提供一套实用的策略与技术手段,帮助您识别、缓解乃至防御UDP攻击,确保服务器稳定运行。我们将探讨监…

最新PHP众筹网站源码 支持报名众筹+商品众筹+公益众筹等多种众筹模式 含完整代码包和部署教程

在当今互联网飞速发展的时代,众筹模式逐渐成为了创新项目、商品销售和公益活动融资的重要渠道。分享一款最新版的PHP众筹网站源码,支持报名众筹、商品众筹和公益众筹等多种众筹模式。该源码包含了完整的代码包和详细的部署教程,让新手也可以轻…

利用医学Twitter进行病理图像分析的视觉-语言基础模型| 文献速递-视觉通用模型与疾病诊断

Title 题目 A visual–language foundation model for pathology image analysis using medical Twitter 利用医学Twitter进行病理图像分析的视觉-语言基础模型 01 文献速递介绍 缺乏公开可用的医学图像标注是计算研究和教育创新的一个重要障碍。同时,许多医生…

自动化测试-Selenium(一),简介

自动化测试-Selenium 1. 什么是自动化测试 1.1 自动化测试介绍 自动化测试是一种通过自动化工具执行测试用例来验证软件功能和性能的过程。与手动测试不同,自动化测试使用脚本和软件来自动执行测试步骤,记录结果,并比较预期输出和实际输出…

【Python报错】已解决ModuleNotFoundError: No module named ‘timm’

成功解决“ModuleNotFoundError: No module named ‘timm’”错误的全面指南 一、引言 在Python编程中,经常会遇到各种导入模块的错误,其中“ModuleNotFoundError: No module named ‘timm’”就是一个典型的例子。这个错误意味着你的Python环境中没有安…

Navicate 导入导出数据库

导出数据库 找地方存在来,别忘了放在那里。 新建一个数据库,记得要和导出数据库的 字符集与排序规则 相同 打开数据库后,我们选择它(就是单击它)然后右键打开菜单-运行sql文件 找到刚才存储的位置,开始 &a…

大中小面积紫外光老化加速试验机装置

高低温试验箱,振动试验台,紫外老化试验箱,氙灯老化试验箱,沙尘试验箱,箱式淋雨试验箱,臭氧老化试验箱,换气老化试验箱,电热鼓风干燥箱,真空干燥箱,超声波清洗机,盐雾试验箱 一、产品用途 紫外光加速老化试验装置采用荧光紫外灯为光源,通过模拟自然阳光中…

oracle报错ORA-01940: cannot drop a user that is currently connected解决方法

目录 一.原因 二.解决方法 1.查询活动会话 2.记下SID和SERIAL# 3.断开会话 4.删除用户 一.原因 ORA-01940代表你正在删除一个有活动会话的用户 二.解决方法 1.查询活动会话 SQL> SELECT sid, serial#, username, programFROM v$sessionWHERE username 你要删除的u…

微信小程序bindgetphonenumber获取手机号阻止冒泡触发

问题&#xff1a;点击手机号弹出微信的手机号验证组件&#xff0c;这是可以的。但是我点击车牌号&#xff0c;也弹出来了&#xff0c;这就郁闷了。 以下是解决方法 点击手机号时&#xff0c;弹出选择手机号 解决&#xff1a; <view style"display: flex;justify-conte…

pdf处理命令合集

安装weasyprint用于生成pdf 单个文件合成多个pdf linux - Merge / convert multiple PDF files into one PDF - Stack Overflow

除了诺贝尔奖的红利,Pasqal 还有哪些实力?

内容来源&#xff1a;量子前哨&#xff08;ID&#xff1a;Qforepost&#xff09; 文丨浪味仙 排版丨沛贤 深度好文&#xff1a;3700字丨13分钟阅读 摘要&#xff1a;与超导量子比特相比&#xff0c;中性原子量子技术的投资成本相对较低、中性原子量子比特无需布线、还能将单…

查看Linux端口占用和开启端口命令

查看端口的使用的情况 lsof 命令 比如查看80端口的使用的情况 lsof -i tcp:80列出所有的端口 netstat -ntlp查看端口的状态 /etc/init.d/iptables status开启端口以开启端口80为例。 1 用命令开启端口 iptables -I INPUT -p tcp --dport 80 -j accpet --写入要开放的端口/…

23 - 每位教师所教授的科目种类的数量(高频 SQL 50 题基础版)

23 - 每位教师所教授的科目种类的数量 考点&#xff1a; 排序和分组 selectteacher_id,count(distinct subject_id) cnt fromTeacher group byteacher_id;

使用python把gif转为图片

使用python把gif转为图片 程序思路效果代码 程序思路 打开 GIF 文件。确保输出文件夹存在&#xff0c;如果不存在则创建。获取 GIF 的帧数。遍历每一帧&#xff0c;将其保存为单独的 PNG 图像&#xff0c;并打印保存路径。 效果 把这张派大星gif转为一张张图片&#xff1a; …

如何搭建一台永久运行的个人服务器?

一、前言 由于本人在这段时候&#xff0c;看到了一个叫做树莓派的东东&#xff0c;初步了解之后觉得很有意思&#xff0c;于是想把整个过程记录下来。 二、树莓派是什么&#xff1f; Raspberry Pi(中文名为树莓派,简写为RPi&#xff0c;(或者RasPi / RPI) 是为学习计算机编程…

kafka学习笔记 @by_TWJ

目录 1. 消息重复消费怎么解决1.1. 确保相同的消息不会被重复发送(消费幂等性)1.2. 消息去重1.3. 消息重试机制1.4. kafka怎么保证消息的顺序性1.4.1. 利用分区的特征&#xff1a;1.4.2. 解决办法&#xff1a;1.4.3. 分区分配策略1.4.3.1. RangeAssignor &#xff08;每组(Topi…