3.3 IMAGE BLUR: A MORE COMPLEX KERNEL

我们研究了vecAddkernel和colorToGreyscaleConversion,其中每个线程只对一个数组元素执行少量算术运算。这些内核很好地服务于其目的:说明基本的CUDA C程序结构和数据并行执行概念。在这一点上,读者应该问一个显而易见的问题——所有CUDA线程是否只相互独立地执行如此简单、微不足道的操作?答案是否定的。在真正的CUDA C程序中,线程通常对其数据执行复杂的算法,并且需要相互合作。在接下来的几章中,我们将研究表现出这些特征的越来越复杂的示例。我们将从图像模糊功能开始。

图像模糊平滑了像素值的突然变化,同时保留了识别图像关键特征所必需的边缘。图3.6说明了图像模糊的效果。简单地说,我们让图像看起来模糊不清。对人眼来说,模糊的图像往往会掩盖精细的细节和现在“大图”印象或图片中的主要主题对象。在计算机图像处理算法中,图像模糊的常见用例是通过用干净的周围像素值纠正有问题的像素值来减少图像中噪声和颗粒渲染效果的影响。在计算机视觉中,图像模糊可用于允许边缘检测和对象识别算法专注于主题对象,而不是受到大量细粒度对象的阻碍。在显示器中,图像模糊有时用于通过模糊图像的其余部分来突出图像的特定部分。

在数学上,图像模糊函数将输出图像像素的值计算为包含输入图像中像素的像素补丁的加权和。正如我们将在第7章中学习的那样,并行模式:卷积,这种加权和的计算属于卷积模式。在本章中,我们将使用简化的方法,取周围像素的NxN补丁的简单平均值,包括我们的目标像素。为了保持算法简单,我们不会根据与目标像素的距离对任何像素的值进行加权,这在高斯模糊等卷积模糊方法中很常见。

图3.7显示了一个使用3 x 3补丁的示例。在(Row,Col)位置计算输出像素值时,我们看到补丁位于(Row,Col)位置的输入像素居中。3×3补丁横跨三行(Row-1,Row,Row+1)和三列(Col-1,Col,Col+1)。举例来说,计算(25,50)输出像素的九个像素的坐标是(24,49),(24,50),(24,51),(25,49),(25,50),(25,51),(26,49),(26,50)和(26,51)。
在这里插入图片描述

图3.8显示图像模糊内核。与colorToGreyscaleConversion类似,我们使用每个线程来计算一个输出像素。也就是说,线程到输出数据映射保持不变。因此,在内核的开头,我们看到了Col和Row索引的熟悉计算。我们还看到了熟悉的if-statement,该状态根据图像的高度和宽度验证Col和Row是否都在有效范围内。只有Col和Row索引在值范围内的线程才能参与执行。
在这里插入图片描述
如图3.7所示,Col和Row值还生成用于计算线程输出像素的补丁的中央像素位置。图3.8 中嵌套的for-loop第3行和第4行。遍阅补丁中的所有像素。我们假设程序有一个定义的常量,BLUR_SIZE。BLUR_SIZE的值设置为2*BLUR_SIZE给出补丁两侧的像素数。对于3×3补丁,BLUR_SIZE设置为1,而对于7×7补丁,BLUR_SIZE设置为3。外部循环通过补丁的行进行循环。对于每行,内部循环在补丁的列中循环。

在我们的3×3补丁示例中,BLUR_SIZE是1。对于计算输出像素(25,50)的线程,在外循环的第一次迭代中,curRow变量是 Row-BLUR_SIZE = (25 − 1) = 24。因此,在外循环的第一次迭代中,内循环迭代第24行中的补丁像素。内部循环使用curCol变量从Col-BLUR_SIZE = 50 − 1 = 49列到 Col+BLUR_SIZE = 51。因此,在外循环的第一次迭代中处理的像素是(24、49)、(24、50)和(24、51)。读者应验证在外循环的第二次迭代中,内循环通过像素(25、49)、(25、50)和(25、51)迭代。最后,在外循环的第三次迭代中,内循环通过像素(26、49)、(26、50)和(26、51)迭代。

第8行使用curRow和curCol的线性化索引来访问当前迭代中访问的输入像素的值。它将像素值累积到运行总和变量pixVal中。第9行记录通过增加像素变量在运行总和中再添加一个像素值。处理完补丁中的所有像素后,第10行通过将像素值除以像素值来计算补丁中像素的平均值。它使用Row和Col的线性化索引将结果写入其输出像素。

第7行包含一个条件声明,以保护第9行和第10行的执行。对于图像边缘附近的输出像素,补丁可能会超出图片的有效范围。图3.9中说明了这一点。假设3×3补丁。在案例1中,左上角的像素被模糊了。预期补丁中的九个像素中有五个在输入图像中不存在。在这种情况下,输出像素的Row和Col值为0和0。在执行嵌套循环期间,九次迭代的CurRow和CurCol值为(-1,-1)、(-1,0)、(-1,1)、(0,-1)、(0,0,)、(0,1)、(1,-1)、(1,0)和(1,1)。请注意,对于图像外的五个像素,其中至少有一个值小于0。if-statement的curRow<0和curCol<0条件捕获这些值,并跳过第8行和第9行的执行。因此,只有四个有效像素的值被累积到运行总和变量中。像素值也正确地增加了四倍,以便在第10行正确计算平均值。
在这里插入图片描述
读者应该研究图3.9中的其他案例,并分析blurKernel中嵌套循环的执行行为。请注意,大多数线程将在输入图像中找到其分配的3 x 3补丁中的所有像素。它们将累积嵌套循环中的所有九个像素。然而,对于四个角落的像素,负责的线程将只积累4个像素。对于四个边缘的其他像素,负责的线程将在嵌套循环中积累6个像素。这些变化需要跟踪可变像素累积的实际像素数。

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

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

相关文章

C++类和对象(万字超详细讲解!!!)

文章目录 前言1.面向过程和面向对象区别2.类的基本概念2.1 类的引入2.2 类的定义2.3 类成员变量的命名规则2.4 类的访问限定符2.5 类的封装2.6 类的作用域2.7 类的实例化 3.类对象模型3.1 如何计算类对象的大小3.2 对齐规则 4.this指针4.1 this指针的引出4.2 this指针的特性4.3…

Android App打包加固后的APK无法安装问题

最近开发的一个应用要上架&#xff0c;正常流程打完包后去加固&#xff0c;由于以前一直用的是360的加固助手&#xff0c;这里开始也是选择用它。 使用360加固&#xff1a; 问题一、开始出现的问题是说应用未签名无法加固&#xff0c;我明明是签名后打的包&#xff0c;怎么会…

2023全球年度安全漏洞TOP 10

数字化转型步伐不断加快&#xff0c;社会各行业迎来了许多发展机遇&#xff0c;但与此同时面临着日益复杂的数据安全和网络安全威胁。其中&#xff0c;安全漏洞数量持续增长更是成为了各行各业不可忽视的挑战&#xff0c;尤其是在工业、金融、交通、国防、医疗和信息技术等领域…

K8S集群调度(2)

schedule的调度算法 预算策略 过滤出合适的节点 优先策略 选择部署的节点 nodeName:硬匹配&#xff0c;不走调度策略。node01. nodeSelector: 根据节点的标签选择&#xff0c;会走调度的算法。 只要是走调度算法&#xff0c;在不满足预算策略的情况下&#xff0c;所有po…

MyBatisPlus学习笔记一

1、简介 MyBatisPlus&#xff08;简称MP&#xff09;是一个MyBatis的增强工具&#xff0c;在MyBatisMyBatisMyBatis的的基础上只做增强不做改变&#xff0c;为简化开发&#xff0c;提高效率而生。 官网&#xff1a;MyBatis-Plus mybatisplus通过扫描实体类&#xff0c;并基于…

2-归并排序

算法&#xff1a;归并排序 思想&#xff1a;分治法【问题分解&#xff0c;归并排序递归解决&#xff0c;合并解】 实现&#xff1a;将数组通过递归方式自顶向下的分解至最小单元&#xff0c;再自底向上进行合并&#xff0c;以此实现排序 时间复杂度&#xff1a; Θ ( n l g n )…

老胡的周刊(第123期)

老胡的信息周刊[1]&#xff0c;记录这周我看到的有价值的信息&#xff0c;主要针对计算机领域&#xff0c;内容主题极大程度被我个人喜好主导。这个项目核心目的在于记录让自己有印象的信息做一个留存以及共享。 &#x1f3af; 项目 ai-video-search-engine[2] 随着 TikTok 和 …

206.【2023年华为OD机试真题(C卷)】最大N个数与最小N个数的和(JavaPythonC++JS实现)

🚀点击这里可直接跳转到本专栏,可查阅顶置最新的华为OD机试宝典~ 本专栏所有题目均包含优质解题思路,高质量解题代码(Java&Python&C++&JS分别实现),详细代码讲解,助你深入学习,深度掌握! 文章目录 一. 题目-最大N个数与最小N个数的和二.解题思路三.题解代…

力扣173. 二叉搜索树迭代器

深度优先搜索 思路&#xff1a; 遍历二叉搜索树&#xff0c;左子树总比根节点小&#xff0c;右子树总比根节点大&#xff1b;先深度遍历左子树&#xff0c;然后返回其父节点&#xff0c;然后遍历其右子树节点&#xff1b;使用栈数据结构存储节点数据&#xff0c;借用其“后进先…

空间转录组与单细胞转录组联合分析——MIA,代码分享(Nature Biotechnology :)

​ 原文&#xff1a;Integrating microarray-based spatial transcriptomics and single-cell RNA-seq reveals tissue architecture in pancreatic ductal adenocarcinomas | Nature Biotechnology 研究者采用 MIA 联合 scRNAseq 和 ST 数据&#xff0c;分析原发性胰腺导管腺癌…

2023年全国职业院校技能大赛(高职组)“云计算应用”赛项赛卷②

2023年全国职业院校技能大赛&#xff08;高职组&#xff09; “云计算应用”赛项赛卷2 目录 需要竞赛软件包环境以及备赛资源可私信博主&#xff01;&#xff01;&#xff01; 2023年全国职业院校技能大赛&#xff08;高职组&#xff09; “云计算应用”赛项赛卷2 模块一 …

NX二次开发 Block UI 指定方位控件的应用

一、概述 NX二次开发中一般都是多个控件的组合&#xff0c;这里我首先对指定方位控件进行说明并结合选择对象控件&#xff0c;具体如下图所示。 二、实现功能获取方位其在选择面上原点的目标 2.1 在initialize_cb()函数中进行初始化&#xff0c;实现对象选择过滤面 //过滤平…

Unity中Shader面片一直面向摄像机

文章目录 前言一、实现思路1、 我们要实现模型面片一直跟着摄像机旋转,那么就需要用到旋转矩阵2、确定 原坐标系 和 目标坐标系3、确定旋转后坐标系基向量二、确定旋转后 坐标系基向量 在 原坐标系 下的值1、Z轴基向量2、假设Y轴基向量 和 世界空间下 的Y轴方向一致竖直向上3、…

go study twoday

交换两个数值 package mainimport "fmt"func main() {var num1 intvar num2 float32fmt.Println("请输入一个整数&#xff1a;")if _, err : fmt.Scanln(&num1); err ! nil {fmt.Println("输入错误&#xff1a;", err)return}fmt.Println(&q…

基于51单片机的蓄水池液位无人监测与自动调节系统设计

设计并实现基于51单片机的蓄水池液位无人监测与自动调节系统是一篇工程实践性很强的技术论文&#xff0c;以下是一个可能的论文提纲示例&#xff1a; **标题&#xff1a;** 基于51单片机的智能蓄水池液位监测与自动调节系统设计 **摘要&#xff1a;** 本文针对蓄水池液位实时…

在 ESP-IDF 环境下,使用标准 C 扩展 Micropython 模块

在 ESP-IDF 环境下&#xff0c;使用标准 C 扩展 Micropython 模块 源码地址 &#xff1a; https://gitee.com/Mars.CN/micropython_extend_example 一、 安装 ESP-IDF 环境 在其他课程中讲过&#xff0c;这里不再赘述&#xff0c;有机会再出教程吧&#xff0c;但需要注意的是…

全网独家:基于openEuler-20.03-LTS-SP4底包构建opengaussV5.0.1LTS的单机极简版数据库容器

本文尝试基于openEuler-20.03-LTS-SP4底包构建opengaussV5.0.1LTS的单机版极简版数据库容器。 一、软件包源 1、openEuler-20.03-LTS容器底包 openEuler-20.03-LTS-SP4 下载链接 sha256:24d8f51c1f3a79eb975c4e498cadd9055bfd708d66c15935ec46664d0f975a7b openEuler-dock…

QT上位机开发(键盘绘图控制)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 绘图是qt很基础的一个功能。通常&#xff0c;我们进行qt绘图的时候&#xff0c;一般会先创建一个qt view&#xff0c;这个相当于视图。接着创建一个…

YOLOv5改进 | 主干篇 | EfficientNetV2均衡缩放网络改进特征提取层

一、本文介绍 这次给大家带来的改进机制是EfficientNetV2,其在其V1版本通过均衡地缩放网络的深度、宽度和分辨率,以提高卷积神经网络的性能的基础上,又提出了一种改进的渐进式学习方法,通过在训练过程中逐步增加图像尺寸并适应性调整正则化来加快训练速度,同时保持准确性…

TinyLog iOS v3.0接入文档

1.背景 为在线教育部提供高效、安全、易用的日志组件。 2.功能介绍 2.1 日志格式化 目前输出的日志格式如下&#xff1a; 日志级别/[YYYY-MM-DD HH:MM:SS MS] TinyLog-Tag: |线程| 代码文件名:行数|函数名|日志输出内容触发flush到文件的时机&#xff1a; 每15分钟定时触发…