这个例子演示了用MATLAB®函数生成的CUDA®MEX函数在图像中进行边缘检测。边缘检测算法采用半精度数据类型实现。
要求
这个示例生成CUDA MEX,并具有以下第三方需求。
CUDA支持NVIDIA®GPU,最低计算能力为6.0,驱动兼容。
可选
对于非mex构建,如静态、动态库或可执行文件,此示例有以下额外需求。
英伟达工具包。
编译器和库的环境变量。有关更多信息,请参见第三方硬件和建立前提产品下载188bet金宝搏.
要验证是否正确设置了运行此示例所需的编译器和库,请使用coder.checkGpuInstall
函数。
envCfg = coder.gpuEnvConfig (“主机”);envCfg。BasicCodegen = 1;envCfg。安静= 1;coder.checkGpuInstall (envCfg);
在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
使用两个正交的滤波核对输入图像进行滤波maskX
和maskY
.滤波操作完成后,算法计算梯度幅值并应用阈值找出图像中被认为是边缘的区域。
使用标准的imread
命令读取图像。imread
表示图像的RGB通道,每个整数代表一个像素。整数形式,取值范围为0 ~ 255。简单地将输入转换为一半类型可能会在卷积期间导致溢出。在本例中,我们可以将图像缩放到0到1之间的值。
我= imread (“peppers.png”);图();图像(im);imPacked =一半(im) / 255;打(100)/ 255 =一半;
生成的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函数之后,您可以验证它具有与原始MATLAB入口点函数相同的功能。运行生成的sobelEdgeDetectionAlg_mex
并画出结果。
out_disp = sobelEdgeDetectionAlg_mex (imPacked,打);显示亮度图像(out_disp);
清除加载到内存中的静态网络对象。
清晰的墨西哥人;
codegen
|coder.gpu.kernel
|coder.gpu.kernelfun
|gpucoder.matrixMatrixKernel
|coder.gpu.constantMemory
|gpucoder.stencilKernel
|coder.checkGpuInstall