主要内容

生成使用半精度数据类型的Sobel边缘检测代码

这个例子展示了如何从MATLAB®函数生成一个独立的c++库,该函数通过使用半精度浮点数执行图像的Sobel边缘检测。Sobel边缘算法接受一个表示为矩阵的图像,并返回一个强调与其边缘对应的高空间频率区域的图像。这个例子还展示了如何使用MEX函数测试生成的代码。

Sobel边缘检测算法

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

类型sobelEdgeDetectionAlg
函数edgeImg = sobelEdgeDetectionAlg(img,thresh) %#codegen %sobelEdgeDetection示例MATLAB中的边缘检测函数。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

索贝尔边缘算法计算水平梯度h垂直梯度v通过使用两个正交的滤波核对输入图像进行滤波maskX而且maskY.在滤波操作之后,算法计算梯度幅度,并应用阈值来找到图像中与边缘对应的区域。

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

使用imread函数读取图像。imread用整数表示图像的RGB通道,每个像素一个。整数,取值范围为0 ~ 255。简单地将输入转换为一半类型可能会导致在卷积期间溢出。要避免此问题,请将图像缩放到0到1之间的值。

Im = imread(“peppers.png”);图();图像(im);impacks = half(im)/255;Thresh = half(100)/255;

生成墨西哥人

的c++ MEX函数sobelEdgeDetectionAlg函数,使用codegen命令。

CFG = code .config(墨西哥人的);cfg。TargetLang =“c++”;cfg。GenerateReport = true;codegen配置cfgarg游戏{imPacked,打}sobelEdgeDetectionAlg
要查看报告,打开('codegen/mex/sobelEdgeDetectionAlg/html/report.mldatx')

运行生成的MEX和显示检测到的边缘

在生成c++代码之前,必须首先在MATLAB环境中测试MEX函数,以确保其功能与原始MATLAB代码等效,并且没有运行时错误。默认情况下,codegen生成一个名为sobelEdgeDetectionAlg_mex在当前文件夹中。这允许您测试MATLAB代码和MEX函数,并比较结果。

out_disp = sobelEdgeDetectionAlg_mex(impacks,thresh);图();显示亮度图像(out_disp);

生成静态c++库

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

CFG = code .config(“自由”);cfg。TargetLang =“c++”;cfg。GenerateReport = true;codegen配置cfgarg游戏{imPacked,打}sobelEdgeDetectionAlg
要查看报告,打开('codegen/lib/sobelEdgeDetectionAlg/html/report.mldatx')

检查生成的函数

类型codegen / lib / sobelEdgeDetectionAlg / sobelEdgeDetectionAlg.cpp
// //文件:sobeledgedetectionalc .cpp // // MATLAB代码版本:5.3 // C/ c++源代码生成于:2021年10月23日05:36:21 // // Include Files # Include“sobelEdgeDetectionAlg.h”# Include“conv2MovingWindowSameCM.h”# Include“rtwhalf.h”# Include“sobelEdgeDetectionAlg_data.h”# Include“sobelEdgeDetectionAlg_initialize.h”# Include  //函数定义// // sobelEdgeDetection示例MATLAB函数的边缘检测。/ /版权2018 MathWorks公司。/ / / /参数:const real16_T img [589824] / / real16_T打/ / unsigned char edgeImg[196608] / /返回类型:空白/ /空白sobelEdgeDetectionAlg (const real16_T img [589824], real16_T颠簸,unsigned char edgeImg[196608]){静态常量real16_T高压[9]{real16_T (1.0 f), real16_T (0.0 f), real16_T (-1.0 f), real16_T (2.0 f), real16_T (0.0 f), real16_T (-2.0 f), real16_T (1.0 f), real16_T (0.0 f), real16_T(-1.0度)};静态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) {sobeledgedetectional_initialize ();} //寻找水平和垂直梯度。编码器::conv2MovingWindowSameCM(*(real16_T(*)[196608]) & img[196608], hv, h);编码器::conv2MovingWindowSameCM(*(real16_T(*)[196608]) & img[196608], hv1, v);//求梯度的大小。 // 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] //

另请参阅

||

相关的话题