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;怎么会…

MyBatisPlus学习笔记一

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

老胡的周刊(第123期)

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

空间转录组与单细胞转录组联合分析——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、…

全网独家:基于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分钟定时触发…

【前端】使用javascript开发一个在线RGB颜色转换

欢迎来到《小5讲堂》 大家好&#xff0c;我是全栈小5。 这是是《前端》序列文章&#xff0c;每篇文章将以博主理解的角度展开讲解&#xff0c; 特别是针对知识点的概念进行叙说&#xff0c;大部分文章将会对这些概念进行实际例子验证&#xff0c;以此达到加深对知识点的理解和掌…

WebGL在实验室方向的应用

WebGL在实验室方向的应用涉及到实验过程的可视化、数据分析、模拟等方面。以下是一些WebGL在实验室领域的应用示例&#xff0c;希望对大家有所帮助。北京木奇移动技术有限公司&#xff0c;专业的软件外包开发公司&#xff0c;欢迎交流合作。 1.分子模型和化学反应模拟&#xff…

Microsoft To-Do使用经验分享,使用Microsoft To-Do更好的规划自己的目标

为什么使用Microsoft To-Do 很久之前尝试使用过onenote,有道云笔记&#xff0c;印象笔记&#xff0c;小米便签等管理自己的日程&#xff0c;有一定的作用&#xff0c;但是功能过于简单或者冗余&#xff0c;没有达到时间管理的目的&#xff0c;没有办法坚持下来&#xff0c;通过…

C++类与对象基础(8)

目录 1. 隐式类型转换与关键字explicit: 1.1 隐式类型转换举例&#xff1a; 1.2 explicit关键字&#xff1a; 2. 友元&#xff1a; 2.1 友元函数&#xff1a; 2.2 友元类&#xff1a; 3. 内部类&#xff1a; 4. 勘误&#xff1a; 1. 隐式类型转换与关键字explicit: 1.1…

网安入门12-文件上传(黑白名单,00截断)

黑名单绕过 Pass-03 有的时候后端限制了一些黑名单&#xff0c;比如过滤后缀名.php 我们就可以用黑名单里没有的后缀名进行绕过&#xff0c;例如&#xff1a; 大小写&#xff1a;.phP .pHp .AsPphp1 .php2 .php3 .php9 .phtml&#xff08;成功率较高&#xff09;特殊文件名绕…

使用kennycason.kumo.WordCloud For JAVA 制作词云图

官网&#xff1a;https://kennycason.com/posts/2014-07-03-kumo-wordcloud.html 一&#xff1a;添加POM文件 <!-- 词云 --><dependency><groupId>com.kennycason</groupId><artifactId>kumo-core</artifactId><version>1.27<…

CHS_01.1.4+操作系统体系结构 一

CHS_01.1.4操作系统体系结构 一 操作系统的体系结构 也就是操作系统的内核应该怎么设计这样一个问题操作系统的内核 在这个小节中 我们会学习 操作系统的体系结构 也就是操作系统的内核应该怎么设计这样一个问题 那这个小节的内容我们只需要做简要的了解就可以了 我们考试中常考…

Day3Qt

1. &#xff08;1&#xff09;完善对话框&#xff0c;点击登录对话框&#xff0c;如果账号和密码匹配&#xff0c;则弹出信息对话框&#xff0c;给出提示”登录成功“&#xff0c;提供一个Ok按钮&#xff0c;用户点击Ok后&#xff0c;关闭登录界面&#xff0c;跳转到其他界面 …