这个例子展示了如何从MATLAB构建一个C可执行文件®实现简单Sobel过滤器以对图像执行边缘检测的代码。可执行文件从磁盘读取图像,应用Sobel过滤算法,然后保存修改后的图像。
该示例演示如何生成和修改示例主函数,您可以在构建可执行文件时使用该函数。
要完成此示例,请安装以下产品:下载188bet金宝搏
MATLAB
Matlab Coder™
C编译器(对于大多数平台,MATLAB提供了默认的C编译器)。有关受支持的编译器列表,请参金宝app见金宝app支持的编译器.
您可以使用mex-设置
更改默认编译器。看更改默认编译器.
本例中使用的文件包括:
文件名 | 文件类型 | 描述 |
---|---|---|
sobel.m |
功能代码 | 一种用MATLAB实现的Sobel滤波算法。sobel.m 以图像(表示为双矩阵)和阈值作为输入。该算法基于阈值检测图像中的边缘。sobel.m 返回显示边缘的修改图像。 |
你好,jpg |
图像文件 | Sobel过滤器修改的图像。 |
要将示例文件复制到本地工作文件夹,请执行以下操作:
创建一个本地工作文件夹。例如,c:\coder\edge\u检测
.
导航到工作文件夹。
复制文件sobel.m
和你好,jpg
从示例文件夹Sobel.
到您的工作文件夹。
COPYFILE(FullFile(Docroot,'工具箱','编码器',“例子”,'sobel'))
将原始图像读入MATLAB矩阵并显示出来。
Im = imread(“hello.jpg”);
显示图像作为与Sobel过滤器结果进行比较的基础。
图像(im);
Sobel过滤算法在灰度图像上运行。将彩色图像转换为具有归一化值的等效灰度图像(0.0为Black,1.0 for White)。
灰色=(0.2989*double(im(:,:,1))+0.5870*double(im(:,:,2))+0.1140*double(im(:,:,3))/255;
要运行Sobel过滤器的MATLAB功能,请传递灰度图像矩阵灰色的
以及函数的阈值Sobel.
.此示例使用0.7阈值。
edgeim = Sobel(灰色,0.7);
要显示修改后的图像,请重新格式化矩阵edgeim
与函数雷普马特
所以你可以把它传递给图像
命令。
im3=repmat(edgeIm,[13]);图像(im3);
要测试生成的代码在功能上与原始MATLAB代码等价,并且不会出现运行时错误,请生成一个MEX函数。
编码基因-报告Sobel.
编码基因
生成一个名为mex函数sobel_mex
在当前工作文件夹中。
要运行Sobel过滤器的MEX函数,需要传递灰度图像矩阵灰色的
以及函数的阈值sobel_mex
.此示例使用0.7阈值。
edgeImMex = sobel_mex(灰色,0.7);
要显示修改后的图像,请重新格式化矩阵埃杰默克斯
与函数雷普马特
所以你可以把它传递给图像
命令。
im3Mex = repmat(edgeImMex, [1 1 3]);图像(im3Mex);
此图像与使用MATLAB函数创建的图像相同。
尽管您可以为应用程序编写自定义主函数,但示例主函数提供了一个模板来帮助您合并生成的代码。
要生成Sobel过滤器的示例主函数,请执行以下操作:
为C静态库创建配置对象。
cfg = coder.config (“自由”);
对于C / C ++源代码,静态库,动态库和可执行文件的配置对象,设置GenerateExampleMain
控制示例主函数的生成。设置为'generatocodeonly'
默认情况下,它生成示例主函数,但不编译它。对于本例,请不要更改GenerateExampleMain
环境。
使用Configuration对象生成C静态库。
编码基因-报告-Config.cfgSobel.
静态库的生成文件位于文件夹中codegen/lib/sobel
. 示例主文件位于子文件夹中codegen/lib/sobel/examples
.
不要修改这些文件main.c
和main.h
在例子
子文件夹。如果这样做,当重新生成代码时,MATLAB编码器不重新生成示例主文件。它会警告您,它会检测到对生成的文件所做的更改。
复制文件main.c
和main.h
从文件夹中codegen/lib/sobel/examples
到另一个地方。对于此示例,将文件复制到当前工作文件夹。修改新位置中的文件。
示例主函数声明并初始化数据,包括动态分配的数据,以零值。它调用具有设置为零值的参数的入口点函数,但它不使用从入口点函数返回的值。
C主函数必须满足应用程序的要求。这个示例修改了示例主函数,以满足Sobel过滤器应用程序的要求。
此示例修改该文件main.c
因此,Sobel过滤器应用程序:
从二进制文件中读取灰度图像。
应用Sobel过滤算法。
将修改后的图像保存为二进制文件。
修改函数主要
:
接受包含灰度图像数据和阈值的文件作为输入参数。
调用这个函数索贝尔大街
以灰度图像数据流的地址和阈值作为输入参数。
在函数中主要
:
删除声明无效(argc)
和(空白)argv
.
声明的变量文件名
持有包含灰度图像数据的二进制文件的名称。
const char *文件名;
声明的变量门槛
保持阈值。
双阈值;
声明的变量fd
持有应用程序读入的灰度图像数据的地址文件名
.
文件* FD;
添加一个如果
检查三个参数的语句。
如果(argc!=3) {printf(“应为2个参数:文件名和阈值\n”);退出(-1);}
指定输入参数argv [1]
为包含灰度图像数据的文件文件名
.
filename = argv [1];
指定输入参数argv [2]
的阈值门槛
,将输入从字符串转换为双精度数字。
阈值= atof(argv [2]);
打开包含在中指定名称的灰度图像数据的文件文件名
. 将数据流的地址分配给fd
.
fd = fopen(文件名,“rb”);
以验证可执行文件是否可以打开文件名
,写一篇如果
- 如果值为价值,则退出程序fd
是无效的
.
if(fd == null){exit(-1);}
替换for的函数调用索贝尔大街
通过调用索贝尔大街
与输入参数fd
和门槛
.
main_sobel(FD,阈值);
调用后关闭灰度图像文件sobel_terminate
.
fclose(FD);
在示例主文件中,函数argInit_d1024xd1024_real_T
为传递给Sobel过滤器的图像创建一个动态分配的可变大小数组(emxArray)。这个函数将emxArray初始化为默认大小,并将emxArray的元素初始化为0。它返回初始化的emxArray。
对于Sobel过滤器应用程序,修改该函数,将灰度图像数据从二进制文件读取到emxArray中。
在函数中argInit_d1024xd1024_real_T
:
替换输入参数空白
随着争论文件*fd
.这个变量指向函数读取的灰度图像数据。
静态emxArray_real_T *argInit_d1024xd1024_real_T(FILE *fd)
更改变量的值iv2
匹配灰度图像矩阵的尺寸灰色的
.iv2
保存要显示的emxArray尺寸的大小值argInit_d1024xd1024_real_T
创建。
静态int IV2 [2] = {484,648};
MATLAB以列主格式存储矩阵数据,C以行主格式存储矩阵数据。相应地声明尺寸。
定义变量元素
持有从灰度图像数据中读取的值。
双元素;
改变为
-loop构造,从标准化图像中读取数据点元素
通过添加一个弗瑞德
命令到内心为
-循环。
Fread (&element, 1, sizeof(element), fd);
在为
-循环,分配元素
作为为emxArray数据设置的值。
结果 - >数据[b_j0 +结果 - > size [0] * b_j1] =元素;
MATLAB函数sobel.m
与MATLAB数组接口,但Sobel过滤器应用程序与二进制文件接口。
要将Sobel滤波算法修改后的图像保存到二进制文件中,请创建一个函数保存图片
.这个函数保存图片
将数据从emxArray写入二进制文件。它使用类似于功能使用的结构argInit_d1024xd1024_real_T
.
在文件中main.c
:
定义的函数保存图片
获取emxArray的地址edgeImage.
作为输入并具有输出类型空隙。
静态void saveImage(emxArray_uint8_T*edgeImage){}
定义变量B_J0.
和B_J1.
就像它们在该功能中定义argInit_d1024xd1024_real_T
.
int b_j0;int b_j1;
定义变量元素
存储从emxArray读取的数据。
UINT8_T元素;
打开一个二进制文件edge.bin
用于写入修改后的映像。分配地址edge.bin
到文件*fd
.
file * fd = fopen(“Edge.bin”,“WB”);
以验证可执行文件是否可以打开edge.bin
,写一篇如果
- 如果值为价值,则退出程序fd
是无效的
.
if(fd == null){exit(-1);}
写一个嵌套为
-loop构造函数argInit_d1024xd1024_real_T
.
for(b_j0 = 0; b_j0size [0u]; b_j0 ++){for(b_j1 = 0; b_j1 size [1u]; b_j1 ++){}}
内部的内在的为
-loop,将修改后的图像数据赋值给元素
.
元素=边缘图像->数据[b_j0+边缘图像->大小[0]*b_j1];
分配后元素
,写入值元素
到文件edge.bin
.
fwrite(&元素,1,sizeof(元素),fd);
之后为
-loop构造,关闭fd
.
fclose(FD);
在示例主函数中,功能索贝尔大街
为灰度和修改后的图像的数据创建Emxarray。它调用函数argInit_d1024xd1024_real_T
初始化灰度图像的emxArray。索贝尔大街
通过emxArrays和初始化函数的阈值0真的吗
返回函数Sobel.
.当这个函数索贝尔大街
结束时,它将丢弃函数的结果Sobel.
.
对于Sobel过滤器应用程序,修改函数索贝尔大街
:
以灰度图像数据的地址和阈值作为输入。
使用从地址读取数据argInit_d1024xd1024_real_T
.
将数据传递给具有阈值的Sobel滤波算法门槛
.
使用以下命令保存结果:保存图片
.
在函数中索贝尔大街
:
用参数替换函数的输入参数文件*fd
和双阈值
.
静态void main_sobel(文件* FD,双阈值)
传递输入参数fd
调用的函数argInit_d1024xd1024_real_T
.
originalImage之下= argInit_d1024xd1024_real_T (fd);
的函数调用中输入的阈值Sobel.
与门槛
.
索贝尔(originalImage之下,阈值,edgeImage);
调用函数后Sobel.
,调用函数保存图片
输入edgeImage.
.
SaptImage(eddeImage);
要匹配对函数定义所做的更改,请对函数声明进行以下更改:
更改功能的输入*argInit_d1024xd1024_real_T
到文件*fd
.
static emxArray_real_T *argInit_d1024xd1024_real_T(FILE *fd); / /配置文件
更改功能的输入索贝尔大街
到文件*fd
和双阈值
.
静态void main_sobel(文件* FD,双阈值);
添加函数保存图片
.
静态void saptimage(emxarray_uint8_t * edgeImage);
用于您使用的输入/输出函数main.c
,添加头文件stdio . h
到包含的文件列表。
#包括
main.c
如果当前不在工作文件夹中,请导航到该文件夹。
为C独立可执行文件创建配置对象。
cfg = coder.config (“exe”);
使用配置对象和修改后的主函数生成用于Sobel过滤器的C独立可执行文件。
编码基因-报告-Config.cfgSobel.main.cmain.h
默认情况下,如果在Windows上运行MATLAB®平台,可执行文件sobel.exe
在当前工作文件夹中生成。如果在Windows以外的平台上运行MATLAB,则文件扩展名是该平台的相应扩展名。默认情况下,为可执行文件生成的代码位于文件夹中codegen/exe/sobel
.
创建MATLAB矩阵灰色的
如果当前不在MATLAB工作区中:
Im = imread(“hello.jpg”);
灰色=(0.2989*double(im(:,:,1))+0.5870*double(im(:,:,2))+0.1140*double(im(:,:,3))/255;
写出矩阵灰色的
使用的是二进制文件福彭
和写入文件
命令。应用程序读入这个二进制文件。
fid = fopen (“gray.bin”,' w '); fwrite(fid,灰色,“双”);fclose(FID);
运行可执行文件,并将文件传递给它gray.bin
阈值为0.7。
在Windows平台的MATLAB中运行示例:
系统(“sobel.exe gray.bin 0.7”);
可执行文件生成文件edge.bin
.
阅读文件edge.bin
转换成MATLAB矩阵edgeImExe
使用福彭
和弗瑞德
命令。
fd=fopen(“edge.bin”,“r”);edrimimexe = fread(FD,尺寸(灰色),'uint8'); fclose(fd);
通过矩阵edgeImExe
到这个功能雷普马特
并显示图像。
im3exe = repmat(edridimexe,[1 1 3]);图像(IM3EXE);
图像与MATLAB和MEX函数匹配图像。