声振论坛

 找回密码
 我要加入

QQ登录

只需一步,快速开始

查看: 2285|回复: 11

[混合编程] matlab源程序的修改

  [复制链接]
发表于 2011-2-28 19:03 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?我要加入

x
MCM_explicit.rar (1.51 KB, 下载次数: 0) 做毕业设计老师给的有错误的源程序代码,让修改成正确的,请大家帮忙啊!功能是“基于平均曲率运动方程的轮廓检测”最好帮忙给每一句程序家注释!下面是源程序(附件里也有源程序代码)
  % %%% 本程序采用显示方案实现“平均曲率运动(MCM)”模型
  clear;
  clc;
  
  %%- 读取曲线数据所在的文件
  [filename, pathname] = uigetfile( ...
  {
  '*.c', 'All c-Files (*.c)'; ...
  '*.dat', 'All tif-Files (*.dat)'; ...
  '*.*','All Files (*.*)'}, ...
  'Select a curve');
  %%- 如点击“取消”则返回
  if isequal([filename,pathname],[0,0])
  return
  end
  
  File = fullfile(pathname,filename);
  strImage=strcat(pathname,filename);
  fid = fopen(strImage,'rt');
  tline = fgetl(fid);
  datalen=str2num(tline(3:length(tline)));
  DataRange=zeros(datalen,2);
  i=0;
  while 1
  i=i+1;
  tline = fgetl(fid);
  if ~ischar(tline), break, end
  divpos=0;
  while 1
  divpos=divpos+1;
  if tline(divpos)==' ', break, end
  end
  DataRange(i,1)=str2num(tline(1:divpos));
  DataRange(i,2)=str2num(tline(divpos:length(tline)));
  end
  fclose(fid);
  hold off
  
  %%- 绘制曲线
  h=subplot(1,1,1);
  fill(DataRange(:,2),DataRange(:,1),[0 0 0]);
  axis ij;
  axis off;
  f = getframe(h);
  [im, map] = frame2im(f);
  im=rgb2gray(im);
  im=double(im);
  im=imresize(im, 0.4);             % 减小图片大小以缩短程序运行时间
  [nnx,nny]=size(im);
  
  
  %%- 检测曲线并将曲线上的点的坐标存入curvIndex
  MaxlLengh=10*nnx+10*nny;
  InitCurvImag=zeros(nnx,nny);
  curvIndex=zeros(MaxlLengh,2);
  num=0;
  for i=1:nnx
  for j=1:nny
  if im(i,j)<5 & (im(i-1,j)>120 | im(i+1,j)>120 | im(i,j-1)>120 |im(i,j+1)>120)
  num=num+1;
  InitCurvImag(i,j)=255;
  curvIndex(num,1)=i;
  curvIndex(num,2)=j;
  for k=1:num-1
  if curvIndex(k,1)==i & curvIndex(k,2)==j
  num=num-1;break
  end
  end
  end
  end
  end
  figure(2);imshow(uint8(InitCurvImag));
  
  %%- 初始化U
  U = zeros(nnx,nny);
  dist=zeros(1,num);
  for j=1:nny
  for i=1:nnx
  for k=1:num
  dist(k)=sqrt((i-curvIndex(k,1)).^2+(j-curvIndex(k,2)).^2);
  end
  U(i,j)=min(dist);
  if im(i,j)<5              % 如果点(i,j)在曲线内部,U为负
  U(i,j)=-U(i,j);
  end
  end
  end
  figure(3);surf(U);                % 显示U
  
  %%-  迭代开始
  dt=0.1;
  DispCurvImag=InitCurvImag;
  for n=1:1000
  U_x = (U(:,[2:nny nny])-U(:,[1 1:nny-1]))/2;
  U_y = (U([2:nnx nnx],:)-U([1 1:nnx-1],:))/2;
  U_xx = U(:,[2:nny nny])+U(:,[1 1:nny-1])-2*U;
  U_yy = U([2:nnx nnx],:)+U([1 1:nnx-1],:)-2*U;
  Dp = U([2:nnx nnx],[2:nny nny])+U([1 1:nnx-1],[1 1:nny-1]);
  Dm = U([1 1:nnx-1],[2:nny nny])+U([2:nnx nnx],[1 1:nny-1]);
  U_xy = (Dp-Dm)/4;
  Num = U_xx.*(U_y.^2)-2*U_x.*U_y.*U_xy+U_yy.*(U_x.^2);
  Den = U_x.^2+U_y.^2;
  I_t = Num./(Den+eps);
  
  U=U+dt*I_t;
  
  if mod(n,200)==0
  num=0;
  curvImag=zeros(nnx,nny);
  %%- 检测当前零水平集
  for i = 2 : nnx - 1
  for j = 2 : nny - 1
  if U(i,j)<0  & (U(i+1,j)>0 | U(i-1,j)>0 | U(i,j+1)>0 | U(i,j-1)>0)
  num=num+1; curvIndex(num,1)=i;curvIndex(num,2)=j;
  curvImag(i,j)=255;
  end
  end
  end
  %%- 重新初始化U
  new_u = zeros(nnx,nny);
  dist=zeros(1,num);
  for j=1:nny
  for i=1:nnx
  for k=1:num
  dist(k)=sqrt((i-curvIndex(k,1)).^2+(j-curvIndex(k,2)).^2);
  end
  new_u(i,j)=min(dist);
  if U(i,j)<0
  new_u(i,j)=-new_u(i,j);
  end
  end
  end
  U=new_u;
  end
  %%- 显示当前零水平集
  if mod(n,200)==0
  DispCurvImag=DispCurvImag+curvImag;
  figure(4);imshow(uint8(DispCurvImag));
  end
  
  end
回复
分享到:

使用道具 举报

发表于 2011-2-28 22:14 | 显示全部楼层
这种事情没有理由让别人代劳的
发表于 2011-3-1 10:21 | 显示全部楼层
你自己先改改,有问题在问,不要直接搞个问题,谁有那么多时间来帮你弄啊?

点评

赞成: 5.0
赞成: 5
  发表于 2011-3-2 23:47
 楼主| 发表于 2011-3-1 11:24 | 显示全部楼层
回复 3 # qibbxxt 的帖子

要是会改就不用发帖了吧!

点评

不是发帖不发帖的问题,是该怎么提问的问题,直接弄个程序,也不告诉别人你什么地方不懂,如果你全部都不懂的话,改了也没有意义  发表于 2011-3-2 08:48
发表于 2011-3-1 18:24 | 显示全部楼层
这个是偷懒的
 楼主| 发表于 2011-3-2 10:34 | 显示全部楼层
回复 4 # ll273191624 的帖子

就是不懂啊,找人帮忙改过来一会自己一般运行一边看是怎么回事!
发表于 2011-3-2 10:37 | 显示全部楼层
你把各个变量
代表什么物理意义
给说清楚
要不然怎么调试
 楼主| 发表于 2011-3-2 20:04 | 显示全部楼层
回复 7 # 狼跃冲顶 的帖子

老师给的就是这些东西了。。。还有就是给了几张图片
发表于 2011-3-2 23:58 | 显示全部楼层

若是LZ真想学, 以下建议才有用!
首先当然要清楚专业问题, 不懂就看书/google/百度...
流程知道后, 进行编程, 有现成的, 就一步一步执行!
边执行边看help边修改! 以上任何地方不清楚再问

肯定需要花很多时间, 但只有这样才能真正有所得, 当然我指的不是文凭
若说没时间, 那只得怪自己太晚开始了
下定决心吧

评分

1

查看全部评分

发表于 2011-3-3 10:55 | 显示全部楼层
据百度搜索知,楼主在其它地方发了类似的帖子。真乃“散弹枪”设计模式与“求调试”经典方法的创造性结合也!看过一个对微软的员工的访谈,对自己的工作都有一种“it's my baby”的自豪,余窃以为是。楼主正值毕设之时,有老师之功在前可鉴,又几年之所学在身可践,何等幸事!今惊见楼主将baby放诸荒野、散诸网络,任旁人评论又未必能得到预期之结果,惜哉!痛哉!科研如孕育,此间之难之痛,实不可避免,旁人或可探讨,终不可替代。忠言逆耳,唯愿楼主(们)自信、自强!

评分

2

查看全部评分

发表于 2011-3-4 09:55 | 显示全部楼层
长见识了,楼上说的让人有点汗颜,向微软员工的精神致敬。
发表于 2011-3-18 11:35 | 显示全部楼层
hustxyong 发表于 2011-2-28 22:14
这种事情没有理由让别人代劳的

顶,论坛就是一个讨论而让更多人受益的地方。
您需要登录后才可以回帖 登录 | 我要加入

本版积分规则

QQ|小黑屋|Archiver|手机版|联系我们|声振论坛

GMT+8, 2024-11-29 10:27 , Processed in 0.060992 second(s), 23 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表