开发者社区> Matlab科研工作室> 正文

【光学】matlab实现光学解包裹及校正

简介: 【光学】matlab实现光学解包裹及校正
+关注继续查看

1 简介

image

image.gif编辑

2 部分代码

function varargout = Multi_GUI(varargin)% 可使用guide查看各控件的句柄和回调函数位置;% GUIDE v2.5;% 初始化代码,请勿编辑gui_Singleton = 1;gui_State = struct('gui_Name',       mfilename, ...    'gui_Singleton',  gui_Singleton, ...    'gui_OpeningFcn', @Multi_GUI_OpeningFcn, ...    'gui_OutputFcn',  @Multi_GUI_OutputFcn, ...    'gui_LayoutFcn',  [] , ...    'gui_Callback',   []);if nargin && ischar(varargin{1}) %%判断输入变量个数及是否为字符组    gui_State.gui_Callback = str2func(varargin{1});%%函数句柄endif nargout  %%函数输出参数数目    [varargout{1:nargout}] = gui_mainfcn(gui_State, varargin{:});else    gui_mainfcn(gui_State, varargin{:});endfunction Multi_GUI_OpeningFcn(hObject,~,handles,varargin)set(groot,'defaultimageUserData',0);set(groot,'defaultlineUserData',0);handles.output = hObject;guidata(hObject, handles);function varargout = Multi_GUI_OutputFcn(~,~,handles)varargout{1} = handles.output;%曲线放大函数function p_ButtonDownFcn(hObject,~)if strcmp(get(gcf,'SelectionType'),'open')&&hObject.Children.UserData==0   %%strcmp比较两个字符串,同1异0; gcf返回当前figure;判断是否是双击 ;    hObject.Children.UserData=1;    S=get(0,'screensize');    F_z=figure('InnerPosition',[S(3)/20,S(4)/15,S(3)*0.9,S(4)*0.9],'Toolbar','none','Menubar', 'none','NumberTitle','Off','Name','放大视图');    p_f=hObject.Position;    P_f=hObject.Parent;    hObject.Parent=F_z;    set(gca,'Position',[0.05,0.05,0.9,0.9]);    F_z.DeleteFcn={@pZoom_DeleteFcn,hObject,P_f,p_f};end%放大窗口删除函数(曲线)function pZoom_DeleteFcn(~,~,a,P_f,p_f)a.Parent=P_f;set(a,'Position',p_f);a.Children.UserData=0;%云图绘制函数function nephogram(ax,data,CLim,target,unit,biaozhi)%(云图坐标区,云图数据,颜色范围矩阵,标题,曲线坐标区)image(ax,data,'CDataMapping','scaled','ButtonDownFcn',{@a_Callback,target,unit,biaozhi});%显示AoP云图 直接和缩放颜色数据映射 scaled为默认 set(ax,'DataAspectRatioMode','manual','DataAspectRatio',[1 1 1]); %设置各个坐标轴数据值的相对比例colormap(ax,jet);%色图矩阵默认colorbar(ax);%差值填色图标尺axis(ax,'off');%坐标轴无上下限caxis(ax,CLim);%设置颜色条数值上下限%单击图片后显示沿截线的分布的回调函数function a_Callback(hObject,~,ax,Unit,biaozhi)%ax为曲线所在坐标区,Unit为纵轴单位hObject.HandleVisibility='off';  %控件的句柄可访问性为不可访问cla(hObject.Parent);%清除已有提示线hObject.HandleVisibility='on';  %可以访问控件的句柄if strcmp(get(gcf,'SelectionType'),'open')&&hObject.UserData==0%若为双击且尚未打开放大窗口,则放大该图片    hObject.UserData=1;    S=get(0,'screensize');  %屏幕尺寸    C0=hObject.CData;  %所画图像中用到的数据    if any(~biaozhi(:))  %any判断向量中是否存在非零元素,biaozhi中是否有0        X=find(sum(1-biaozhi)~=0); %列求和,生成行向量        Y=find(sum(1-biaozhi,2)~=0); %行求和,生成列向量        hObject.Parent.XLim=[0.5 length(X)+0.5]; %        hObject.Parent.YLim=[0.5 length(Y)+0.5]; %        hObject.CData=C0(Y(1):Y(end),X(1):X(end)); %    end    [h,w]=size(hObject.CData);  %h行数w列数    cm=colormap(hObject.Parent);      F_z=figure('Visible','off','InnerPosition',[S(3)/20,S(4)/15,S(3)*0.9,S(4)*0.9],'Colormap',cm,'Toolbar','none','Menubar', 'none','NumberTitle','Off','Name','放大视图');    ca=copyobj(hObject.Parent,F_z); %复制图形对象及其后代,复制hObject标识的一个或多个图形对象并返回新对象句柄或新对象数组。新图形对象是F_z指定的图形对象的子级    set(gca,'Position',[0.025,0.025,0.95,0.95]);    ca.Children.ButtonDownFcn={@a_Callback,ax,Unit,biaozhi};    ca.Children.UserData=1;    c=colorbar(ca);        ca.YAxis.Label.Units='pixels';    F_z.InnerPosition(3)=c.Position(3)*F_z.InnerPosition(3)+w/h*F_z.InnerPosition(4)+ca.TickLength(2)*F_z.InnerPosition(4)-ca.YAxis.Label.Extent(1);    ca.YAxis.Label.Units='data';    F_z.Visible='on';    F_z.DeleteFcn={@Copy_DeleteFcn,hObject,C0};else    if ~isempty(ax.Children) %判断是否为非空        mark=ax.Children.UserData;    else        mark=0;function popupmenu2_Callback(hObject,~,handles) %#ok<DEFNU>switch get(hObject,'Value')    case 1        if isfield(handles,'p1')            nephogram(handles.axes3,handles.p1,[min(handles.p1(handles.p1~=0)),max(handles.p1(handles.p1~=0))],handles.axes4,[],handles.biaozhi)%(云图坐标区,云图数据,颜色范围矩阵,标题,曲线坐标区)        end    case 2        if isfield(handles,'p2')            nephogram(handles.axes3,handles.p2,[min(handles.p2(handles.p2~=0)),max(handles.p2(handles.p2~=0))],handles.axes4,[],handles.biaozhi)%(云图坐标区,云图数据,颜色范围矩阵,标题,曲线坐标区)        endendfunction pushbutton_save_Callback(~,~,handles) %#ok<DEFNU>path=uigetdir([getenv('userprofile'),'\desktop'],'选择φ1和φ2数据的保存路径');if path~=0     dlmwrite([path,'\phi1.txt'],handles.p1);     dlmwrite([path,'\phi2.txt'],handles.p2);end

3 仿真结果

image

image.gif编辑

4 参考文献

[1]王永红, 陈维杰, 钟诗民,等. 相位解包裹技术及应用研究进展[J]. 测控技术, 2018, 037(012):1-7,16.

博主简介:擅长智能优化算法、神经网络预测、信号处理、元胞自动机、图像处理、路径规划、无人机等多种领域的Matlab仿真,相关matlab代码问题可私信交流。

部分理论引用网络文献,若有侵权联系博主删除。

image

image.gif编辑

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
如何设置阿里云服务器安全组?阿里云安全组规则详细解说
阿里云安全组设置详细图文教程(收藏起来) 阿里云服务器安全组设置规则分享,阿里云服务器安全组如何放行端口设置教程。阿里云会要求客户设置安全组,如果不设置,阿里云会指定默认的安全组。那么,这个安全组是什么呢?顾名思义,就是为了服务器安全设置的。安全组其实就是一个虚拟的防火墙,可以让用户从端口、IP的维度来筛选对应服务器的访问者,从而形成一个云上的安全域。
18784 0
阿里云服务器如何登录?阿里云服务器的三种登录方法
购买阿里云ECS云服务器后如何登录?场景不同,阿里云优惠总结大概有三种登录方式: 登录到ECS云服务器控制台 在ECS云服务器控制台用户可以更改密码、更换系.
27955 0
阿里云服务器安全组设置内网互通的方法
虽然0.0.0.0/0使用非常方便,但是发现很多同学使用它来做内网互通,这是有安全风险的,实例有可能会在经典网络被内网IP访问到。下面介绍一下四种安全的内网互联设置方法。 购买前请先:领取阿里云幸运券,有很多优惠,可到下文中领取。
22042 0
阿里云服务器ECS登录用户名是什么?系统不同默认账号也不同
阿里云服务器Windows系统默认用户名administrator,Linux镜像服务器用户名root
15479 0
阿里云服务器端口号设置
阿里云服务器初级使用者可能面临的问题之一. 使用tomcat或者其他服务器软件设置端口号后,比如 一些不是默认的, mysql的 3306, mssql的1433,有时候打不开网页, 原因是没有在ecs安全组去设置这个端口号. 解决: 点击ecs下网络和安全下的安全组 在弹出的安全组中,如果没有就新建安全组,然后点击配置规则 最后如上图点击添加...或快速创建.   have fun!  将编程看作是一门艺术,而不单单是个技术。
20097 0
阿里云服务器怎么设置密码?怎么停机?怎么重启服务器?
如果在创建实例时没有设置密码,或者密码丢失,您可以在控制台上重新设置实例的登录密码。本文仅描述如何在 ECS 管理控制台上修改实例登录密码。
23536 0
腾讯云服务器 设置ngxin + fastdfs +tomcat 开机自启动
在tomcat中新建一个可以启动的 .sh 脚本文件 /usr/local/tomcat7/bin/ export JAVA_HOME=/usr/local/java/jdk7 export PATH=$JAVA_HOME/bin/:$PATH export CLASSPATH=.
14867 0
+关注
Matlab科研工作室
matlab工程师
182
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
JS零基础入门教程(上册)
立即下载
性能优化方法论
立即下载
手把手学习日志服务SLS,云启实验室实战指南
立即下载