|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?注册
x
小弟将hough、gradephase(相位编组法)、thresh_md(最大方差法计算分割门限)这几个函数的m文件存入MATLAB6p5p1 \ toolbox \ images \ images里面。
然后建立一个m文件
i=imread('liftingbody.png')
imshow(i);
bw=hough(i);
figure,imshow(bw)
运行后显示:
??? Undefined function or variable 'hough'.
Error in ==> E:\gongju\MATLAB6p5p1\work\Untitled.m
On line 3 ==> bw=hough(i);
另外两个函数运行后也是这样,请问该如何调用这个函数
hough代码为:
function hough(x)
%该函数实现hough变换提取直线的功能。
%输入图像x,运行之后直接画出直线。
[m,n]=size(x);
%求出图像大小。
md=round(sqrt(m^2+n^2));
%确定网格的最大区域。
ma=180;
ruthta=zeros(md,ma);
%产生计数矩阵。
ruthx=cell(1,1);
%数组cell相当于c语言中的指针,可动态改变大小。
for i=1:md
for j=1:ma
ruthx{i,j}=[];
end
end
%产生空网格。
for i=5:m-4
for j=5:n-4
if bw(i,j)==1
for k=1:ma
ru=round(abs(j*cos(i(k))+i*sin(i(k))));
%根据直线的法线式表示,计算出%平面上不同点的hough变换值。
ruthta(ru+1,k)=ruthta(ru+1,k)+1;
%将hough变换值相应位置的计数值加1。
ruthx{ru+1,k}=[ruthx{ru+1,k},[i,j]'];
%纪录hough变换值相应位置对应的点的坐标。
end
end
end
end
figure(1)
bw=ones(size(bw));
imshow(bw);
N=1;%这里假设图像上有一条主要直线。
for i=1:N
%这里假定图像上有N条主要直线。
[y1,coll]=max(ruthta);
[y2,row]=max(y1);
%求出变换值最大值的坐标。
col=coll(row);
ruthta(col,row)=0;
%为必免重复计算,将计算过的点置为0。
N=3;
if col-N>0&col+N<md&row-N>0&row+N<ma
ruthta(col-N:col+N,row-N:row+N)=0;
end
nds=ruthx{col,row};
pline=draw_l(nds);
end
function pline=draw_l(im)
%此函数实现根据在一条直线上点的坐标,计算出直线参数,并画出直线的功能。
y=im(1,;
x=im(2,;
mx=max(x); nx=min(x);
%确定直线在x方向的范围。
my=max(y); ny=min(y);
%确定直线在y方向的范围。
cx=mean(x); cy=mean(y);
%计算出直线的中心点坐标。
xx=x-cx; yy=y-cy;
a=sum(xx.^2)-sum(xx)^2;
b=sum(xx.*yy)-sum(xx)*sum(yy);
c=sum(yy.^2)-sum(yy)^2;
Vs=(a+c)/2+sqrt((a-c)^2/4+b^2);
%利用最小二乘拟合直线,求出与直线斜率有关的Vs。
if abs((Vs-a)/(b+eps))<=1
my=floor(cy+(Vs-a)/(b+eps)*(mx-cx));
ny=floor(cy+(Vs-a)/(b+eps)*(nx-cx));
else
mx=floor(cx+b/(Vs-a+eps)*(my-cy));
nx=floor(cx+b/(Vs-a+eps)*(ny-cy));
end
%为避免斜率大于1时计算端点坐标误差过大,根据斜率值分别确定最大的x坐标或者y坐标。
line([nx,mx],[ny,my]);
%画出直线。
pline=[[nx,ny]',[mx,my]'];
gradephase代码为:
function gradephase(x)
[m,n]=size(x);
bw=edge(x,'sobel');
gy=x(1:m-1,1:n-1)-x(2:m,1:n-1);
gy=x(1:m-1,1:n-1)-x(1:m-1,2:n);
g=gy./(gy+eps);
ph=atan(g)+(sign(gx)<0 & sign(gy)>0)*pi+...
(sign(gx)<0 & sign(gy)<0)*pi+(sign(gx)>0 & sign(gy)<0)*pi+...
(sign(gx)==0)*pi;
grdgp=floor(ph/pi*4)+1;
cn=0; s=[];
ln_spt=cell(1,1);
pline=[];
for i=2:m-1
for j=2:n-1
if bw(i,j)~=0&grdgp(i,j)~=0
ph_cp=grdgp(i,j); grdgp(i,j)=0; bw(i,j)=0;
cn=cn+1; p=[i,j]';
s=[s,p]; ln_spt{cn}=[p];
while ~isempty(s)
[cs,rs]=size(s);
ps=s(:,rs); s=s(:,1:rs-1);
col=ps(1,1); row=ps(2,1);
if legal(col+1,row,m,n)&grdgp(col+1,row)==ph_cp
s=[s,[col+1,row]']; ln_spt{cn}=[ln_spt{cn},[col+1,row+1]'];
bw(col+1,row)=0; grdgp(col+1,row)=0;
end
if legal(col+1,row+1,m,n)&grdgp(col+1,row+1)==ph_cp
s=[s,[col+1,row+1]']; ln_spt{cn}=[ln_spt{cn},[col+1,row+1]'];
bw(col+1,row)=0; grdgp(col+1,row)=0;
end
if legal(col,row+1,m,n)&grdgp(col,row+1)==ph_cp
s=[s,[col,row+1]']; ln_spt{cn}=[ln_spt{cn},[col,row+1]'];
bw(col,row+1)=0; grdgp(col,row+1)=0;
end
if legal(col-1,row+1,m,n)&grdgp(col-1,row+1)==ph_cp
s=[s,[col-1,row+1]']; ln_spt{cn}=[ln_spt{cn},[col-1,row+1]'];
bw(col-1,row+1)=0; grdgp(col-1,row+1)=0;
end
if legal(col-1,row,m,n)&grdgp(col-1,row)==ph_cp
s=[s,[col-1,row]']; ln_spt{cn}=[ln_spt{cn},[col-1,row]'];
bw(col-1,row)=0; grdgp(col-1,row)=0;
end
if legal(col-1,row-1,m,n)&grdgp(col-1,row-1)==ph_cp
s=[s,[col-1,row-1]'];
ln_spt{cn}=[ln_spt{cn},[col-1,row-1]'];
bw(col-1,row-1)=0; grdgp(col-1,row-1)=0;
end
if legal(col,row-1,m,n)&grdgp(col,row-1)==ph_cp
s=[s,[col,row-1]']; ln_spt{cn}=[ln_spt{cn},[col,row-1]'];
bw(col,row-1)=0; grdgp(col,row-1)=0;
end
if legal(col+1,row-1,m,n)&grdgp(col+1,row-1)==ph_cp
s=[s,[col+1,row-1]']; ln_spt{cn}=[ln_spt{cn},[col+1,row-1]'];
bw(col+1,row-1)=0; grdgp(col+1,row-1)=0;
end
end
if length(ln_spt{cn})<=10
ln_spt{cn}=[];
cn=cn-1;
else
plne=draw_l(ln_spt{cn});
pline=[pline,plne];
c(i)=length(ln_spt{cn});
end
end
end
end
thresh_md 代码为:
function th=thresh_md(a);
count=imhist(a);
[m,n]=size(a);
N=m*n-sum(sum(find(a==0),1));
L=256;
count=count/N;
for i=2
if count(i)~=0
st=i-1;
break;
end
end
f=count(st+1:nd+1);
p=st; q=nd-st;
u=0;
for i=1:q;
u=u+f(i)*(p+i-1);
ua(i)=u;
end;
for i=1:q;
w(i)=sum(f(1:i));
end;
d=(u*w-ua).^2./(w.*(1-w));
[y,tp]=max(d);
th=tp+p;
万分感谢了!
|
|