半精度Sobel方法的边缘检测
这个例子演示了用CUDA®MEX函数从MATLAB®函数生成的图像边缘检测。边缘检测算法采用半精度数据类型实现。
第三方的先决条件
要求
本例生成CUDA MEX,并具有以下第三方需求。
CUDA支持NVIDIA®GPU,最低计算能力为6.0和兼容的驱动程序。
可选
对于非mex构建,如静态、动态库或可执行程序,此示例具有以下附加要求。
英伟达工具包。
编译器和库的环境变量。有关更多信息,请参见第三方硬件而且设置必备产品2022世界杯八强谁会赢?.
验证GPU环境
要验证运行此示例所需的编译器和库是否已正确设置,请使用coder.checkGpuInstall
函数。
envCfg = code . 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),kern,'same');V = conv2(img(:,:,2),kern','same');求梯度的大小。E =√(h。*h + v *v); % Threshold the edges edgeImg = uint8((e > thresh) * 240); end
Sobel边缘算法计算水平梯度resX
垂直梯度resY
用两个正交的滤波核对输入图像进行滤波maskX
而且maskY
.在滤波操作完成后,算法计算梯度幅值并应用阈值来寻找图像中被认为是边缘的区域。
读取图像和包装数据到RGBA包装列主要订单
使用标准imread
命令读取图像。imread
表示具有整数的图像的RGB通道,每个像素一个。整数形式,取值范围为0 ~ 255。简单地将输入转换为半类型可能会在卷积期间导致溢出。在本例中,我们可以将图像缩放到0到1之间的值。
我的意思是:“peppers.png”);图();图像(im);impacks =一半(im)/255;脱粒率=一半(100)/255;
为函数生成CUDA MEX
生成CUDA MEXsobelEdgeDetectionAlg
函数,创建一个GPU代码配置对象并运行codegen
命令。为了生成和执行具有半精度数据类型的代码,CUDA计算能力需要6.0或更高。设置ComputeCapability
属性的代码配置对象“6.0”
.对于半精度,生成CUDA代码的内存分配(malloc)模式必须设置为“离散”。
cfg = code .gpu config (墨西哥人的);cfg.GpuConfig.ComputeCapability =“6.0”;cfg.GpuConfig.MallocMode =“离散”;codegen配置cfgarg游戏{imPacked,打}sobelEdgeDetectionAlg;
代码生成成功。
执行MEX命令功能
在您生成MEX函数之后,您可以验证它具有与原始MATLAB入口点函数相同的功能。运行生成的sobelEdgeDetectionAlg_mex
然后画出结果。
out_disp = sobelEdgeDetectionAlg_mex(impked,thresh);显示亮度图像(out_disp);
清除MEX内存。
清除内存中加载的静态网络对象。
清晰的墨西哥人;
另请参阅
功能
codegen
|coder.gpu.kernel
|coder.gpu.kernelfun
|gpucoder.matrixMatrixKernel
|coder.gpu.constantMemory
|gpucoder.stencilKernel
|coder.checkGpuInstall