主要内容

半精度Sobel方法的边缘检测

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

第三方的先决条件

要求

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

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

可选

对于非mex构建,如静态、动态库或可执行程序,此示例具有以下附加要求。

验证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内存。

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

清晰的墨西哥人

另请参阅

功能

对象

相关的话题

Baidu
map