主要内容

生成代码Sobel边缘检测,使用Half-Precision数据类型

这个例子展示了如何生成一个独立的c++库从MATLAB®函数执行Sobel边缘检测的图像通过使用half-precision浮点数。接受一个形象,Sobel边缘算法表示为一个矩阵,并返回一个图像强调高空间频率区域对应于边缘。这个示例还展示了如何测试生成的代码通过使用一个墨西哥人的功能。

Sobel边缘检测算法

Sobel边缘检测算法,二维空间梯度在灰度图像上执行操作。这个操作强调高空间频率区域对应于图像中的边缘。

类型sobelEdgeDetectionAlg
打函数edgeImg = sobelEdgeDetectionAlg (img) % # codegen %入口点函数half-precision Sobel边缘检测的例子。% 2018 - 2022版权MathWorks公司kern =一半([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

Sobel边缘算法计算水平梯度h和垂直梯度v输入图像通过使用两个正交滤波器的内核maskXmaskY。过滤操作后,该算法计算梯度大小和一个阈值适用于找到对应的区域的图像边缘。

包装图片和包装数据读入RGBA列顺序

使用imread函数来读取图像。imread与整数代表图像的RGB通道,每个像素一个。从0到255的整数范围。简单的铸件输入类型可能导致溢出在旋转的一半。为了避免这个问题,规模图像值在0和1之间。

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

生成墨西哥人

生成c++函数的墨西哥人sobelEdgeDetectionAlg函数使用codegen命令。

cfg = coder.config (墨西哥人的);cfg。TargetLang =“c++”;cfg。GenerateReport = true;codegen配置cfgarg游戏{imPacked,打}sobelEdgeDetectionAlg
代码生成成功:查看报告,打开(“codegen /墨西哥人/ sobelEdgeDetectionAlg / html / report.mldatx”)

运行生成的墨西哥人并显示检测到的边缘

生成c++代码之前,您必须首先测试墨西哥人功能在MATLAB环境来确保它的功能相当于原来的MATLAB代码并没有运行时错误发生。默认情况下,codegen生成一个墨西哥人命名函数sobelEdgeDetectionAlg_mex在当前文件夹。这允许您测试MATLAB代码和墨西哥人功能和比较结果。

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

生成静态的c++库

使用codegen命令来生成一个c++静态库。默认情况下,生成的库位于文件夹codegen / lib / sobelEdgeDetectionAlg /

cfg = coder.config (“自由”);cfg。TargetLang =“c++”;cfg。GenerateReport = true;codegen配置cfgarg游戏{imPacked,打}sobelEdgeDetectionAlg;
代码生成成功:查看报告,打开(“codegen / lib / sobelEdgeDetectionAlg / html / report.mldatx”)

检查生成的函数

类型codegen / lib / sobelEdgeDetectionAlg / sobelEdgeDetectionAlg.cpp
/ / / /文件:sobelEdgeDetectionAlg。cpp / / / / MATLAB编码器版本:5.6 / / C / c++源代码生成:03 - mar - 2023 04:51:05 / / / / #包括“sobelEdgeDetectionAlg包括文件。h conv2MovingWindowSameCM # include。h rtwhalf # include。h" #include "sobelEdgeDetectionAlg_data.h" #include "sobelEdgeDetectionAlg_initialize.h" #include  // Function Definitions // // Entry-point function for half-precision Sobel edge detection example. // Copyright 2018-2022 The MathWorks, Inc. // // Arguments : const real16_T img[589824] // real16_T thresh // unsigned char edgeImg[196608] // Return Type : void // void sobelEdgeDetectionAlg(const real16_T img[589824], real16_T thresh, unsigned char edgeImg[196608]) { static const real16_T hv[9]{real16_T(1.0F), real16_T(0.0F), real16_T(-1.0F), real16_T(2.0F), real16_T(0.0F), real16_T(-2.0F), real16_T(1.0F), real16_T(0.0F), real16_T(-1.0F)}; static const real16_T hv1[9]{ real16_T(1.0F), real16_T(2.0F), real16_T(1.0F), real16_T(0.0F), real16_T(0.0F), real16_T(0.0F), real16_T(-1.0F), real16_T(-2.0F), real16_T(-1.0F)}; static real16_T h[196608]; static real16_T v[196608]; if (!isInitialized_sobelEdgeDetectionAlg) { sobelEdgeDetectionAlg_initialize(); } // Finding horizontal and vertical gradients. coder::conv2MovingWindowSameCM(&img[196608], hv, h); coder::conv2MovingWindowSameCM(&img[196608], hv1, v); // Finding magnitude of the gradients. // Threshold the edges for (int k{0}; k < 196608; k++) { real16_T b_h; real16_T h1; b_h = h[k]; h1 = v[k]; b_h = static_cast( std::sqrt(static_cast(b_h * b_h + h1 * h1))); h[k] = b_h; edgeImg[k] = static_cast((b_h > thresh) * 240U); } } // // File trailer for sobelEdgeDetectionAlg.cpp // // [EOF] //

另请参阅

||

相关的话题