出于加快执行速度、底层代码或者核心代码保护等目的,MATLAB会调用一些C/C++代码,这些代码经MATLAB编译器(mex指令)生成二进制文件(通常是文件名后缀为mexw32或者mexw64)。这些文件是可以被MATLAB解释器自动装载并执行的动态链接程序,类似windows下的dll文件。
这里的houghmex就是这种,所以你是看不到源代码的。
网上可以找到的一个参考在下面,但我并不清楚现在的MATLAB版本中是否还是用这个C++代码生成hough的mex。
定点(2,3)半径203,又边要超出边界003,画面调整成为高度(3-203),宽2,最右下角的点就是圆的一边顶点,再画面调整为高3,宽2,这个点是圆心;
调整画面为高3宽(2+203),这个时候最右下角的点是圆的右面顶点,现在圆心定啦,上顶点和右顶点也定,知道这3个点就能画出想要的圆。
输入的离散点在
变量X中
X=[x1 y1 z1;
x2 y2 z2;
是一个n行,3列的矩阵,1,2,3列分别为x,y,z坐标
p0=mean(X);%以重心为初始圆心
r02=mean(sqrt(sum((X-repmat(p0,[size(X,1) 1]))^2,2)));%以到重心的平均距离为初始半径
f=@(p)(X(:,1)-p(1))^2+(X(:,2)-p(2))^2+(X(:,3)-p(3))^2-p(4)^2;
p=lsqnonlin(f,[p0 r02]);
x0=p(1);y0=p(2);z0=p(3);
radii=abs(p(4));
x0 y0 z0 为圆心坐标
radii为半径。
扩展资料:
如果物体没有中心,则该术语可能指其周长,其外接圆的半径或外接球体。 在任一情况下,半径可以大于直径的一半,通常将其定义为图中任何两个点之间的最大距离。 几何图形的半径通常是其中包含的最大圆或球的半径。 环,管或其他中空物体的内半径是其空腔的半径。
对于常规多边形,半径与其周长相同。正多边形的内半径也称为心距。在图论中,图的半径是从u到图的任何其他顶点的最大距离的所有顶点u的最小值。
参考资料来源:百度百科-圆心
Hough变换是图像处理中从图像中识别几何形状的基本方法之一。Hough变换的基本原理在于利用点与线的对偶性,将原始图像空间的给定的曲线通过曲线表达形式变为参数空间的一个点。这样就把原始图像中给定曲线的检测问题转化为寻找参数空间中的峰值问题。也即把检测整体特性转化为检测局部特性。比如直线、椭圆、圆、弧线等。
Hough变换的基本思想
设已知一黑白图像上画了一条直线,要求出这条直线所在的位置。我们知道,直线的方程可以用y=kx+b 来表示,其中k和b是参数,分别是斜率和截距。过某一点(x0,y0)的所有直线的参数都会满足方程y0=kx0+b。即点(x0,y0)确定了一族直线。方程y0=kx0+b在参数k--b平面上是一条直线,(你也可以是方程b=-x0k+y0对应的直线)。这样,图像x--y平面上的一个前景像素点就对应到参数平面上的一条直线。我们举个例子说明解决前面那个问题的原理。设图像上的直线是y=x, 我们先取上面的三个点:A(0,0), B(1,1), C(22)。可以求出,过A点的直线的参数要满足方程b=0, 过B点的直线的参数要满足方程1=k+b, 过C点的直线的参数要满足方程2=2k+b, 这三个方程就对应着参数平面上的三条直线,而这三条直线会相交于一点(k=1,b=0)。 同理,原图像上直线y=x上的其它点(如(3,3),(4,4)等) 对应参数平面上的直线也会通过点(k=1,b=0)。这个性质就为我们解决问题提供了方法,就是把图像平面上的点对应到参数平面上的线,最后通过统计特性来解决问题。假如图像平面上有两条直线,那么最终在参数平面上就会看到两个峰值点,依此类推。
简而言之,Hough变换思想为:在原始图像坐标系下的一个点对应了参数坐标系中的一条直线,同样参数坐标系的一条直线对应了原始坐标系下的一个点,然后,原始坐标系下呈现直线的所有点,它们的斜率和截距是相同的,所以它们在参数坐标系下对应于同一个点。这样在将原始坐标系下的各个点投影到参数坐标系下之后,看参数坐标系下有没有聚集点,这样的聚集点就对应了原始坐标系下的直线。
首先,初始化一块缓冲区,对应于参数平面,将其所有数据置为0对于图像上每一前景点,求出参数平面对应的直线,把这直线上的所有点的值都加1。最后,找到参数平面上最大点的位置,这个位置就是原图像上直线的参数。
在实际应用中,y=kx+b形式的直线方程没有办法表示x=c形式的直线(这时候,直线的斜率为无穷大)。所以实际应用中,是采用参数方程p=xcos(theta)+ysin(theta)。这样,图像平面上的一个点就对应到参数p---theta平面上的一条曲线上,其它的还是一样。
Hough变换推广
1、已知半径的圆
其实Hough变换可以检测任意的已知表达形式的曲线,关键是看其参数空间的选择,参数空间的选择可以根据它的表达形式而定。比如圆的表达形式为,所以当检测某一半径的圆的时候,可以选择与原图像空间同样的空间作为参数空间。那么圆图像空间中的一个圆对应了参数空间中的一个点,参数空间中的一个点对应了图像空间中的一个圆,圆图像空间中在同一个圆上的点,它们的参数相同即a,b相同,那么它们在参数空间中的对应的圆就会过同一个点(a,b),所以,将原图像空间中的所有点变换到参数空间后,根据参数空间中点的聚集程度就可以判断出图像空间中有没有近似于圆的图形。如果有的话,这个参数就是圆的参数。
2、未知半径的圆对于圆的半径未知的情况下,可以看作是有三个参数的圆的检测,中心和半径。这个时候原理仍然相同,只是参数空间的维数升高,计算量增大。图像空间中的任意一个点都对应了参数空间中的一簇圆曲线。,其实是一个圆锥型。参数空间中的任意一个点对应了图像空间中的一个圆。
3、椭圆椭圆有5个自由参数,所以它的参数空间是5维的,因此他的计算量非常大,所以提出了许多的改进算法。
图像空间中的在同一个圆,直线,椭圆上的点,每一个点都对应了参数空间中的一个图形,在图像空间中这些点都满足它们的方程这一个条件,所以这些点,每个投影后得到的图像都会经过这个参数空间中的点。也就是在参数空间中它们会相交于一点。所以,当参数空间中的这个相交点的越大的话,那么说明元图像空间中满足这个参数的图形越饱满。越象我们要检测的东西。 Hough变换能够查找任意的曲线,只要你给定它的方程。Hough变换在检验已知形状的目标方面具有受曲线间断影响小和不受图形旋转的影响的优点,即使目标有稍许缺损或污染也能被正确识别。
以上就是关于关于matlab 中hough源程序问题:全部的内容,包括:关于matlab 中hough源程序问题:、MATLAB拟合圆 及 得到圆的半径、急求用c或c++实现直线检测的hough变换源代码等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)