找回密码
 注册
查看: 1544|回复: 1

告急!那位大哥帮我看看!

[复制链接]
发表于 2004-5-19 23:22:14 | 显示全部楼层 |阅读模式

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

您需要 登录 才可以下载或查看,没有账号?注册

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;        
  万分感谢了!               
                 
            
                     
                     
                     
                     
                    
   
   
发表于 2004-5-23 12:13:20 | 显示全部楼层

告急!那位大哥帮我看看!

是不是搜索路径不对?
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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