版块导航
正在加载中...
客户端APP下载
登录
注册
帖子
帖子
用户
本版
应《网络安全法》要求,自2017年10月1日起,未进行实名认证将不得使用互联网跟帖服务。为保障您的帐号能够正常使用,请尽快对帐号进行手机号验证,感谢您的理解与支持!
24小时热门版块排行榜
>
论坛更新日志
(4601)
>
文献求助
(311)
>
论文投稿
(273)
>
导师招生
(270)
>
博后之家
(245)
>
虫友互识
(166)
>
硕博家园
(92)
>
考博
(83)
>
有机交流
(81)
>
招聘信息布告栏
(66)
>
学术会议
(49)
>
休闲灌水
(34)
>
基金申请
(26)
>
教师之家
(22)
>
找工作
(22)
>
考研
(19)
小木虫论坛-学术科研互动平台
»
计算模拟区
»
仿真模拟
»
MATLAB
»
【求助】计算N幅图像中圆的中心点坐标【已解决】
1
1/1
返回列表
查看: 1953 | 回复: 5
只看楼主
@他人
存档
新回复提醒
(忽略)
收藏
在APP中查看
当前主题已经存档。
本帖产生 1 个 仿真EPI ,点击这里进行查看
当前只显示满足指定条件的回帖,点击这里查看本话题的所有回帖
anyuezhiji
银虫
(正式写手)
星空行者
仿真EPI: 5
应助: 0
(幼儿园)
贵宾: 0.208
金币: 467.3
红花: 3
帖子: 416
在线: 89.3小时
虫号: 943880
注册: 2010-01-17
性别: GG
专业: 凝聚态物性 II :电子结构
★ ★ ★
小木虫(金币
+0.5
):给个红包,谢谢回帖交流
adu886886(金币+2, 仿真EPI+1):谢谢认真指导 2010-04-15 08:27
最终修改的程序 稍有变化 比如滤掉杂点的功能
有兴趣的虫友话可以把它和前面的代码比较
找找有什么不同
CODE:
function Find_CirclesCenter
%%Find Center of circles from picture
%%PSL@CSU
%%QQ:547423688
%%Email:anyuezhiji@qq.com
%%Edit @ 2010.4.14
path='D:\Program Files\MATLAB71\work\CurrentWork\test\';
outfile='CResult.txt';
clear CResult;
n=0;
maxcm=0;
flag=1;
for i=1:720
fname=['8-',num2str(i)];
filename=[fname,'.spe'];
if exist([path,filename],'file')
disp(['正在处理',filename]);
n=n+1;
[img,dtype]=ReadSpe([path,filename]);
%figure;imshow(img);
minp=min(min(img));
mask=img<3*minp;
mask = bwmorph(mask,'clean');
mask = bwmorph(mask,'majority',inf);
%figure;imshow(mask);
CResult(n).fname=fname;
CResult(n).R=[];
CResult(n).C=[];
[L,m]=bwlabel(mask);
%m
if flag
for i=1:m
mask1=mask;
mask1(find(L~=i))=0;
BW = edge(uint8(mask1),'sobel');
%figure,imshow(BW);
[r,c]=find(BW~=0);
%eval(['BW',num2str(i),'=BW;']);
%eval(['edge',num2str(i),'=[r c];']);
CircleEdge=[r,c];
[r,center]=findcenter(CircleEdge,2);
CResult(n).R=[CResult(n).R;round(r)];
CResult(n).C=[CResult(n).C;round(center([2 1]))];
end
if m>maxcm
maxcm=m;
end
CResult(n).num=m;
[tc,p]=sort(CResult(n).C(:,2));
CResult(n).C=CResult(n).C(p,:);
fidout=fopen([path,outfile],'a+');
fprintf(fidout,'%-8s',CResult(n).fname);
cc=CResult(n).C;
for j=1:m
fprintf(fidout,'\t\t圆心%d:(%5d,%5d)',j,cc(j,1),cc(j,2));
end
fprintf(fidout,'\n');
fclose(fidout);
end%end if flag
end
end
if flag
fidout=fopen([path,outfile],'a+');
fprintf(fidout,'\n');
fprintf(fidout,'\n');
for j=1:maxcm
fprintf(fidout,'%%圆心%d坐标\n',j);
fprintf(fidout,'x%d=[',j);
for i=1:n
if j<=CResult(i).num
fprintf(fidout,'%5d',CResult(i).C(j,1));
else
fprintf(fidout,' nan');
end
end
fprintf(fidout,']'';\n');
fprintf(fidout,'y%d=[',j);
for i=1:n
if j<=CResult(i).num
fprintf(fidout,'%5d',CResult(i).C(j,2));
else
fprintf(fidout,' nan');
end
end
fprintf(fidout,']'';\n');
end
fprintf(fidout,'\n');
fprintf(fidout,'\n');
fclose(fidout);
end%end if flag
function [R,C]=findcenter(edge,mode)
%mode1 相加取中点
%mode2 最小二乘拟合圆x^2+y^2+a(1)*x+a(2)*y+a(3)=0
%mode3 用遗传算法,找到一点和一个半径R,各点到这点的距离与R之差的平方和最小
[m,n]= size(edge);
switch mode
case 1
C=sum(edge)/m;
R=sum(sqrt((edge(:,1)-C(1)).^2+(edge(:,2)-C(2)).^2))/m;
case 2
A=[edge(:,1) edge(:,2) ones(m,1)];
B=-[edge(:,1).*edge(:,1)+edge(:,2).*edge(:,2)];
a=A\B;
C=-.5*a([1 2])';
R = sqrt((a(1)^2+a(2)^2)/4-a(3));
case 3
save('edge_m','edge','m');
%[x, fval, reason]=ga(fitnessfcn,nvars,A,b,Aeq,beq,LB,UB,nonlcon,options)
C=sum(edge)/m;
R=sum(sqrt((edge(:,1)-C(1)).^2+(edge(:,2)-C(2)).^2))/m;
options = gaoptimset('Generations',200,'InitialPopulation',[R,C],...
'PopulationSize',50,'TolFun',1e-7,'TolCon',1e-7,'MutationFcn',@mutationadaptfeasible );
[sol, fval, exitflag] = ga(@f,3,[],[],[],[],[0,min(edge)],[2*R,max(edge)],[],options);
R=sol(1);
C=sol([2,3]);
fval
end
%适应度函数的matlab代码
function [eval]=f(sol)
load edge_m
R=sol(1);
C=sol([2,3]);
eval=sum((sqrt((edge(:,1)-C(1)).^2+(edge(:,2)-C(2)).^2)-R).^2)/m;
%读取.spe文件
function [data,data_type] = ReadSpe(filename,startX,endX,startY,endY)
fid=fopen(filename,'r','ieee-le');
[header,count]=fread(fid,4100,'uint8');
dataType=header(109);
xdim=header(43) + header(44)*2^8;
ydim=header(657) + header(658)*2^8;
frames=header(1447) + header(1448)*2^8 +header(1449)*2^16 + header(1450)
*2^24;
if ~exist('startX','var')
startX = 1;
end
if ~exist('endX','var')
endX=xdim;
end
if ~exist('startY','var')
startY=1;
end
if ~exist('endY','var')
endY=ydim;
end
strDataType={'float32','int32','int16','uint16'};
data_type=strDataType{dataType+1};
if (dataType>3)
fclose(fid);
fprintf(strcat('Unknown WinSpec data type: ',num2str(dataType)));
clear data;
data=[];
return;
end;
data=zeros([xdim,endY-startY+1,frames]);
dataSize=max((dataType<2)+1)*2;
for z=1:frames
fseek(fid,4100+dataSize*(xdim*((startY-1)+ydim*(z-1))),'bof');
[data(1:xdim,1:(endY-startY+1),z),count]=fread(fid,[xdim (endY-startY+1)],strcat(strDataType{dataType+1},'=>',strDataType{dataType+1}));
end;
data=permute(data,[2 1 3]);
data=data(:,startX:endX,:);
fclose(fid);
[
Last edited by anyuezhiji on 2010-4-14 at 21:07
]
赞
一下
(3人)
回复此楼
暗月下没有留下风的痕迹,但它已经寂然飘逝。。By&amp;lt;暗月之寂&amp;gt;:tiger38:
6楼
2010-04-14 21:03:47
已阅
回复此楼
关注TA
给TA发消息
送TA红花
TA的回帖
相关版块跳转
第一性原理
量子化学
计算模拟
分子模拟
仿真模拟
程序语言
我要订阅楼主
飞扬2282
的主题更新
1
1/1
返回列表
如果回帖内容含有宣传信息,请如实选中。否则帐号将被全论坛禁言
普通表情
龙
兔
虎
猫
高级回复
(可上传附件)
百度网盘
|
360云盘
|
千易网盘
|
华为网盘
在新窗口页面中打开自己喜欢的网盘网站,将文件上传后,然后将下载链接复制到帖子内容中就可以了。
信息提示
关闭
请填处理意见
关闭
确定