3.17[A]CV

在计算机图形学中,反走样(Antialiasing) 是一种用于减少图像中锯齿状边缘(aliasing artifacts)的技术。当绘制曲线或图形时,由于像素的离散性,曲线边缘可能会出现锯齿状的失真。反走样通过考虑曲线与像素的精确几何关系,调整像素的颜色值,使曲线边缘更加平滑。

对于 Bézier 曲线的反走样,关键在于准确计算曲线覆盖每个像素的程度,并根据覆盖程度调整像素的颜色

反走样 是通过模拟连续信号在离散采样下的表现,减少由于采样不足导致的失真。在图形学中,主要表现为:

  • 锯齿现象:曲线或图形边缘呈现阶梯状。
  • 原因:曲线在像素网格上的离散表示不精确。
  • 目标:使曲线边缘平滑,接近真实形状。

bezier:该函数实现绘制 Bézier 曲线的功能。它使用一个控制点序列和一个 OpenCV:: Mat 对象作为输入, 没有返回值。它会使 t 在 0 到 1 的范围内进 行迭代, 并在每次迭代中使 t 增加一个微小值。对于每个需要计算的 t,将 调用另一个函数 recursive_bezier,然后该函数将返回在 Bézier 曲线上 t 处的点。最后,将返回的点绘制在 OpenCV :: Mat 对象上。 • recursive_bezier:该函数使用一个控制点序列和一个浮点数 t 作为输入, 实现 de Casteljau 算法来返回 Bézier 曲线上对应点的坐标。

反走样原理

对于 Bézier 曲线上的每个点:

  1. 计算曲线对周围像素的影响(例如,点到像素中心的距离)。
  2. 根据影响程度调整像素的颜色值(例如,使用灰度值或透明度)。
  3. 对多个曲线点的影响进行累积,生成平滑的边缘

  1. 采样曲线
    • 使用 de Casteljau 算法生成曲线上的点。
    • 对于每个点,计算其对周围像素的影响。
  2. 累积影响
    • 使用一个缓冲区(如浮点数组)记录每个像素的累积颜色值。
    • 根据曲线点到像素的距离,调整累积值(例如,使用高斯函数或线性衰减)。
  3. 归一化并绘制
    • 将累积值归一化到 [0, 255] 范围。
    • 将结果绘制到图像上。

问题 2:antialiased_bezier 的归一化问题

  • 在 antialiased_bezier 中,你对累积缓冲区 buffer 进行了归一化操作:buffer /= 255.0;
  • 如果累积的最大值小于 255,归一化后会导致颜色值过暗,甚至接近黑色。

解决方法

  • 在归一化之前,找到 buffer 中的最大值,并用该值进行归一化,而不是直接使用 255。

  • 累积的本质:在 antialiased_bezier 中,你对每个像素的浮点值进行了累积(buffer.at<cv::Vec3f>(ny, nx)[2] += weight;)。由于累积操作,某些像素的值可能会变得非常大,具体取决于曲线的密度和覆盖的像素数量。
  • 显示范围限制:图像像素的值必须在 0-255 的范围内(对于 8 位图像)。如果不进行归一化,累积的浮点值可能远超 255,导致图像过曝或颜色失真。

示例

  • 假设某个像素的累积值为 500,而另一个像素的累积值为 10。如果不归一化,直接映射到 0-255,这两个像素的值会分别变成 255 和 5(假设简单线性映射),导致颜色对比度极低,细节丢失。

归一化确保颜色分布合理

  • 动态范围调整:归一化会将累积缓冲区的值重新映射到 0-1 的范围(或 0-255),使得所有像素的值在相同的动态范围内。这样可以确保颜色分布合理,细节清晰可见。
  • 对比度增强:归一化可以增强图像的对比度,使得曲线在不同区域的亮度差异更加明显。

示例

  • 假设累积缓冲区的值范围是 10 到 500。归一化后,10 会映射到 0,500 会映射到 1(或 255)。这样,原本差异较大的值会被拉伸到整个颜色范围,增强了对比度。

为什么不能直接绘制而不归一化?

  • 浮点值无法直接显示:累积缓冲区是浮点类型(CV_32FC3),而图像显示需要整数类型(CV_8UC3)。直接将浮点值映射到 0-255 而不归一化,会导致颜色值不准确,因为浮点值的范围可能远超 0-255。
  • 颜色失真:如果不归一化,某些像素的值可能会过大或过小,导致颜色失真。例如,累积值较大的像素会过曝(变成白色),而累积值较小的像素会过暗(变成黑色)。

示例

  • 假设累积缓冲区的值范围是 0.1 到 1000。如果不归一化,直接映射到 0-255,0.1 会变成 0(黑色),1000 会变成 255(白色)。这样,大部分像素都会变成白色,细节完全丢失。

什么是 8 位图像?

  • 位深度(Bit Depth):图像的位深度决定了每个像素可以表示的颜色数量。
    • 8 位:每个像素用 8 位表示,值范围是 0 到 255。
    • 16 位:每个像素用 16 位表示,值范围是 0 到 65535。
    • 32 位浮点:每个像素用 32 位浮点数表示,值范围可以是任意浮点数。
  • 颜色通道
    • 灰度图像:只有一个颜色通道,通常是亮度(intensity)。
    • 彩色图像:通常有多个颜色通道,如 RGB(红、绿、蓝)图像有 3 个通道。
  • 8 位彩色图像
    • 每个像素有 3 个颜色通道(R、G、B)。
    • 每个通道的值范围是 0 到 255。
    • 例如,CV_8UC3 表示一个 8 位无符号整数(unsigned char)的 3 通道图像。
  • buffer:这是一个累积缓冲区,类型为 CV_32FC3,表示每个像素有 3 个颜色通道,每个通道是 32 位浮点数。
  • window:这是目标图像,类型为 CV_8UC3,表示每个像素有 3 个颜色通道,每个通道是 8 位无符号整数。
  • CV_8UC3
    • CV_8U 表示 8 位无符号整数(unsigned char)。
    • C3 表示 3 个通道(通常是 RGB)。
  • 255.0:这是缩放因子,用于将浮点数值映射到 0-255 的范围。

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

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

相关文章

集成学习(上):Bagging集成方法

一、什么是集成学习&#xff1f; 在机器学习的世界里&#xff0c;没有哪个模型是完美无缺的。就像古希腊神话中的"盲人摸象"&#xff0c;单个模型往往只能捕捉到数据特征的某个侧面。但当我们把多个模型的智慧集合起来&#xff0c;就能像拼图一样还原出完整的真相&a…

【LangChain】理论及应用实战(5):Agent

文章目录 一、基本介绍1.1 Agent介绍1.2 Agent示例 二、几种主要的Agent类型2.1 ZERO_SHOT_REACT_DESCRIPTION2.2 CHAT_ZERO_SHOT_REACT_DESCRIPTION2.3 CONVERSATIONAL_REACT_DESCRIPTION2.4 CHAT_CONVERSATIONAL_REACT_DESCRIPTION2.5 OPENAI_FUNCTIONS 三、给Agent增加Memor…

口袋书签系统:AI 智能生成分类描述,省时又高效

口袋书签一键触达&#xff0c;免费使用&#xff1a;https://navfinder.cn/ 口袋书签系统新增了“根据收藏站点&#xff0c;AI自动生成分类描述”的功能&#xff0c;简要说明如下&#xff1a; 自动分析站点信息 系统会根据用户当前分类中的站点标题、标签等信息&#xff0c;结合…

AtCoder Beginner Contest 397 A - D题解

Tasks - OMRON Corporation Programming Contest 2025 (AtCoder Beginner Contest 397) 本文为 AtCoder Beginner Contest 397 A - D题解 题目A: 代码(C): #include <bits/stdc.h>int main() {double n;std::cin >> n;if (n > 38.0) {std::cout << 1;}…

linux按照nginx

第一步先按照依赖gcc 一键安装上面四个依赖 Nginx的编译安装需要一些依赖库&#xff0c;如gcc、make、zlib、openssl等。可以使用yum命令安装这些依赖&#xff1a; yum -y install gcc zlib zlib-devel pcre-devel openssl openssl-devel 创建目录 mkdir /usr/nginx 切换…

Muon: An optimizer for hidden layers in neural networks

引言 在深度学习领域&#xff0c;优化算法对模型训练效率和性能起着关键作用。从经典的随机梯度下降 (SGD) 及其动量法&#xff0c;到自适应优化方法 Adam/AdamW 等&#xff0c;一系列优化器大大加速了神经网络的收敛。然而&#xff0c;随着模型规模和数据量的爆炸式增长&…

数据结构与算法-图论-拓扑排序

前置芝士 概念 拓扑排序&#xff08;Topological Sorting&#xff09;是对有向无环图&#xff08;DAG&#xff0c;Directed Acyclic Graph&#xff09;的顶点进行排序的一种算法。它将图中的所有顶点排成一个线性序列&#xff0c;使得对于图中的任意一条有向边 (u, v)&#x…

市长海报/ Mayor‘s posters

AB 省 Bytetown 的市民无法忍受市长竞选活动的候选人随心所欲地将他们的选举海报贴在各个地方。市议会最终决定建造一面选举墙来放置海报&#xff0c;并引入以下规则&#xff1a; 每个候选人都可以在墙上放置一张海报。所有海报的高度都与墙壁的高度相同;海报的宽度可以是任意整…

LeetCode hot 100—验证二叉搜索树

题目 给你一个二叉树的根节点 root &#xff0c;判断其是否是一个有效的二叉搜索树。 有效 二叉搜索树定义如下&#xff1a; 节点的左子树只包含 小于 当前节点的数。节点的右子树只包含 大于 当前节点的数。所有左子树和右子树自身必须也是二叉搜索树。 示例 示例 1&#…

ccfcsp3402矩阵重塑(其二)

//矩阵重塑&#xff08;其二&#xff09; #include<iostream> using namespace std; int main(){int n,m,t;cin>>n>>m>>t;int c[10000][10000];int s0,sum0;int d[10000],k[100000];for(int i0;i<n;i){for(int j0;j<m;j){cin>>c[i][j];d[s…

MCP和Function Calling的区别

文章目录 1、什么是MCP1.1、定义和特点1.2、架构和工作原理3.3、MCP 的主要优势 2、什么是Function Calling3、MCP和Function Calling的区别4、总结 &#x1f343;作者介绍&#xff1a;双非本科大四网络工程专业在读&#xff0c;阿里云专家博主&#xff0c;前三年专注于Java领域…

裂缝识别系统 Matlab GUI设计

使用说明 裂缝识别系统 Matlab GUI设计 &#xff0c;运行环境Matlab2023b及以上&#xff1b; 一种基于MATLAB图形用户界面&#xff08;GUI&#xff09;的裂缝自动识别系统&#xff0c;该系统利用数字图像处理技术实现裂缝图像的预处理&#xff0c;集成均衡化、噪声滤波、对比…

【源码分析】Nacos实例注册流程分析-事件驱动框架

【踩坑记录】 本人下载的Nacos 服务端版本是2.3.2&#xff0c;在开始进行源码编译便遇到问题&#xff0c;下面是各个问题记录 源码大量爆红 在最开始用Idea加载Maven项目的时候&#xff0c;发现项目中大量的代码爆红&#xff0c;提示其类或者包不存在&#xff0c;后来结果查…

51单片机指令系统入门

目录 基本概念讲解 一、机器指令​ 二、汇编指令​ &#xff08;一&#xff09;汇编指令的一般格式 &#xff08;二&#xff09;按字节数分类的指令 三、高级指令 总结​ 基本概念讲解 指令是计算机&#xff08;或单片机&#xff09;中 CPU 能够识别并执行的基本操作命令…

mysql5.x和mysql8.x查看和设置隔离级别

MySQL的隔离级别 级别标志值描述读未提交READ-UNCOMMITTED0存在脏读、不可重复读、幻读的问题读已提交READ-COMMITTED1解决脏读的问题&#xff0c;存在不可重复读、幻读的问题可重复读REPEATABLE-READ2mysql 默认级别&#xff0c;解决脏读、不可重复读的问题&#xff0c;存在幻…

【函数式编程】【C#/F#】第四讲:单子与函子 - 抽象的编程模式

在第二讲中我们探讨了一个诚实的函数应该要做到什么事&#xff0c;并运用了一种方法&#xff0c;让我们可以去准确的描述数据。 不过有一种情况让我们始料未及&#xff0c;例如网站需要收集一些信息&#xff0c;但有些信息不是必须的&#xff0c;是可有可无的。如果我们要去准…

【vue2 + Cesium】使用Cesium、添加第三方地图、去掉商标、Cesium基础配置、地图放大缩小事件、获取可视区域、层级、高度

参考文章&#xff1a; vue2 使用 cesium 篇【第一篇】 vue2 使用 cesium 【第二篇-相机视角移动添加模型】 vue2 项目模版&#xff1a; vue2-common 安装 cesium npm install cesium --save这个就很简单&#xff0c;只需要一句简简单单的命令就可以实现在 vue 项目中安装 ce…

vllm-openai多服务器集群部署AI模型

服务器配置是两台ubantu系统电脑,每台电脑安装两张4090-48G显存的显卡,共计192G显存。 服务器1 服务器2 准备工作: 1.两台电脑都已经安装了docker 2.两台电脑都已经安装了nvidia驱动 参考vllm官方资料 https://docs.vllm.ai/en/latest/serving/distributed_serving.html…

【电源】斩波电路

文章目录 前言定义概念 缩写降压斩波电路使用步骤总结参考文献 前言 进行大创项目开发的学习 bilibili 定义概念 缩写 斩波电路&#xff1a;分为降压&#xff0c;电荷泵&#xff0c;升压&#xff0c;升降压&#xff0c;Cuk&#xff0c;Speic&#xff0c;Zeta 等等 降压斩…

Hadoop集群组成

&#xff08;一&#xff09;Hadoop的组成 对普通用户来说&#xff0c; Hadoop就是一个东西&#xff0c;一个整体&#xff0c;它能给我们提供无限的磁盘用来保存文件&#xff0c;可以使用提供强大的计算能力。 在Hadoop3.X中&#xff0c;hadoop一共有三个组成部…