如何使用Simulink实现MATLAB图像采集与输出

描述

本文将介绍如何使用Simulink提供的回调函数机制,实现从MATLAB工作空间采集和输出图像。

Simulink回调函数机制
在空白处右键->Model Properties,切换到“Callbacks”标签下,可以看到Simulink支持的回调函数,这些函数在某些时刻会自动触发,执行M文件中的程序:

 

 

点击每个函数,可以在右边看到该函数的触发时刻;右边的编辑框中输入执行的M文件的名称。M文件与slx文件在同一目录下。

System Generator设计
数据流方法完成图像的采集与输出,其实就是从MATLAB的工作空间中导入图像数据,再将结果导出到工作空间。按下图连接model:

 

matlab

 

From Workspace从工作空间中读取数据;To Workspace将数据导出到工作空间。读出数据时会受到采样时间的控制,因此读出的为标量数据,可以直接接入Gateway In中。三个输入模块和输出模块分别对应R、G、B三个通道,双击打开配置界面,在“Data”中设置变量名称。

设计思路如下:在启动模型时,设计一个函数读取图片并将图片转换为From Worspace兼容的格式;在仿真结束时,设计一个函数将输出的数据重新整理为图片格式并显示结果。添加一个PreLoadFcn回调函数LoadImg.m、一个StopFcn回调函数ShowImg.m,分别完成上述功能。

回调函数设计
LoadImg.m文件的代码清单如下:
%读取图片
img = imread('test.jpg');

%读取图片尺寸
width = size(img, 2); %长
height = size(img, 1); %宽

%读取R、G、B通道,2维转1维
inimg_r = reshape(img(:,:,1), 1, width*height);
inimg_g = reshape(img(:,:,2), 1, width*height);
inimg_b = reshape(img(:,:,3), 1, width*height);

%From Workspace读取的变量要求为double类型矩阵
%第一列为时间;其余列为数据
inimg_r = [(0:width*height-1)' double(inimg_r)'];
inimg_g = [(0:width*height-1)' double(inimg_g)'];
inimg_b = [(0:width*height-1)' double(inimg_b)'];

注意From Workspace读取的变量(inimg_r、inimg_g、inimg_b)中的第一列为采样时间设置,这里设计为每个时刻读一个像素值。StopFcn.m文件的代码清单如下:
%一维转二维
out_r = reshape(outimg_r(1:width*height), height, width);
out_g = reshape(outimg_g(1:width*height), height, width);
out_b = reshape(outimg_b(1:width*height), height, width);

%组合R、G、B通道
showimg = zeros(width, height, 3);
showimg(:,:,1) = out_r;
showimg(:,:,2) = out_g;
showimg(:,:,3) = out_b;

subplot(121);
imshow(img); title('输入图像');
subplot(122);
imshow(uint8(showimg)); title('输出图像');

将RGB三通道合为一副图像并显示。

仿真测试
读取一副256*256的RGB图像,系统采样时间为1s,仿真时长设置为256*256,即只读取一次完整的图像。先关闭slx文件,再次启动,此时MATLAB的工作空间:

 

matlab

 

可见启动时执行了LoadImg函数。运行仿真后,MATLAB的工作空间:

 

matlab

 

可见仿真结束时执行了ShowImg函数,弹出结果图如下:

 

 

在某些方面讲,基于数据流方法的图像采集与输出要更灵活,设计者可以根据需要随意设计回调函数(当然回调函数的用途不限于此)。

编辑:hfy

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分