matlab源程序的修改
做毕业设计老师给的有错误的源程序代码,让修改成正确的,请大家帮忙啊!功能是“基于平均曲率运动方程的轮廓检测”最好帮忙给每一句程序家注释!下面是源程序(附件里也有源程序代码)% %%% 本程序采用显示方案实现“平均曲率运动(MCM)”模型
clear;
clc;
%%- 读取曲线数据所在的文件
= uigetfile( ...
{
'*.c', 'All c-Files (*.c)'; ...
'*.dat', 'All tif-Files (*.dat)'; ...
'*.*','All Files (*.*)'}, ...
'Select a curve');
%%- 如点击“取消”则返回
if isequal(,)
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),);
axis ij;
axis off;
f = getframe(h);
= frame2im(f);
im=rgb2gray(im);
im=double(im);
im=imresize(im, 0.4); % 减小图片大小以缩短程序运行时间
=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(:,)-U(:,))/2;
U_y = (U(,:)-U(,:))/2;
U_xx = U(:,)+U(:,)-2*U;
U_yy = U(,:)+U(,:)-2*U;
Dp = U(,)+U(,);
Dm = U(,)+U(,);
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 这种事情没有理由让别人代劳的 你自己先改改,有问题在问,不要直接搞个问题,谁有那么多时间来帮你弄啊? 回复 3 # qibbxxt 的帖子
要是会改就不用发帖了吧! 这个是偷懒的{:{23}:} 回复 4 # ll273191624 的帖子
就是不懂啊,找人帮忙改过来一会自己一般运行一边看是怎么回事! 你把各个变量
代表什么物理意义
给说清楚
要不然怎么调试 回复 7 # 狼跃冲顶 的帖子
老师给的就是这些东西了。。。还有就是给了几张图片 ll273191624 发表于 2011-3-2 10:34 static/image/common/back.gif
回复 4 # ll273191624 的帖子
就是不懂啊,找人帮忙改过来一会自己一般运行一边看是怎么回事!
若是LZ真想学, 以下建议才有用!
首先当然要清楚专业问题, 不懂就看书/google/百度...
流程知道后, 进行编程, 有现成的, 就一步一步执行!
边执行边看help边修改! 以上任何地方不清楚再问
肯定需要花很多时间, 但只有这样才能真正有所得, 当然我指的不是文凭
若说没时间, 那只得怪自己太晚开始了
下定决心吧 据百度搜索知,楼主在其它地方发了类似的帖子。真乃“散弹枪”设计模式与“求调试”经典方法的创造性结合也!看过一个对微软的员工的访谈,对自己的工作都有一种“it's my baby”的自豪,余窃以为是。楼主正值毕设之时,有老师之功在前可鉴,又几年之所学在身可践,何等幸事!今惊见楼主将baby放诸荒野、散诸网络,任旁人评论又未必能得到预期之结果,惜哉!痛哉!科研如孕育,此间之难之痛,实不可避免,旁人或可探讨,终不可替代。忠言逆耳,唯愿楼主(们)自信、自强! {:{40}:}长见识了,楼上说的让人有点汗颜,向微软员工的精神致敬。 hustxyong 发表于 2011-2-28 22:14 static/image/common/back.gif
这种事情没有理由让别人代劳的
顶,论坛就是一个讨论而让更多人受益的地方。
页:
[1]