主要内容

半精度Sobel法边缘检测

这个例子演示了用MATLAB®函数生成的CUDA®MEX函数在图像中进行边缘检测。边缘检测算法采用半精度数据类型实现。

第三方的先决条件

要求

这个示例生成CUDA MEX,并具有以下第三方需求。

  • CUDA支持NVIDIA®GPU,最低计算能力为6.0,驱动兼容。

可选

对于非mex构建,如静态、动态库或可执行文件,此示例有以下额外需求。

验证GPU环境

要验证是否正确设置了运行此示例所需的编译器和库,请使用coder.checkGpuInstall函数。

envCfg = coder.gpuEnvConfig (“主机”);envCfg。BasicCodegen = 1;envCfg。安静= 1;coder.checkGpuInstall (envCfg);

Sobel边缘检测算法

在Sobel边缘检测算法中sobelEdgeDetectionAlg.m,对灰度图像进行二维空间梯度运算。该操作强调对应于图像边缘的高空间频率区域。

类型sobelEdgeDetectionAlg
函数edgeImg = sobelEdgeDetectionAlg(img,thresh) %#codegen %sobelEdgeDetection边缘检测的MATLAB函数示例。版权所有2018 The MathWorks, Inc. kern = half([1 2 1;0 0 0;1 2 1]);寻找水平和垂直梯度。h = conv2 (img(:,: 2),克恩,“相同”);v = conv2 (img(:,: 2),克恩”、“相同”);%求梯度的大小。e =√h。* h + v * v); % Threshold the edges edgeImg = uint8((e > thresh) * 240); end

索贝尔边缘算法计算水平梯度resX以及垂直梯度resY使用两个正交的滤波核对输入图像进行滤波maskXmaskY.滤波操作完成后,算法计算梯度幅值并应用阈值找出图像中被认为是边缘的区域。

读取图像和打包数据到RGBA打包列主要顺序

使用标准的imread命令读取图像。imread表示图像的RGB通道,每个整数代表一个像素。整数形式,取值范围为0 ~ 255。简单地将输入转换为一半类型可能会在卷积期间导致溢出。在本例中,我们可以将图像缩放到0到1之间的值。

我= imread (“peppers.png”);图();图像(im);imPacked =一半(im) / 255;打(100)/ 255 =一半;

为函数生成CUDA MEX

生成的CUDA MEXsobelEdgeDetectionAlg函数,创建图形处理器代码配置对象,并运行codegen命令。要生成和执行具有半精度数据类型的代码,需要CUDA 6.0或更高的计算能力。设置ComputeCapability的代码配置对象的属性“6.0”.对于半精度,生成CUDA代码的内存分配(malloc)模式必须设置为“Discrete”。

cfg = coder.gpuConfig (墨西哥人的);cfg.GpuConfig.ComputeCapability =“6.0”;cfg.GpuConfig.MallocMode =“离散”;codegen配置cfgarg游戏{imPacked,打}sobelEdgeDetectionAlg
代码生成成功。

运行MEX函数

生成一个MEX函数之后,您可以验证它具有与原始MATLAB入口点函数相同的功能。运行生成的sobelEdgeDetectionAlg_mex并画出结果。

out_disp = sobelEdgeDetectionAlg_mex (imPacked,打);显示亮度图像(out_disp);

清晰的墨西哥人的记忆。

清除加载到内存中的静态网络对象。

清晰的墨西哥人

另请参阅

功能

对象

相关的话题