下文给各位讲解与相似度检测类有关的技巧,对您的论文查重复有参考学习作用。
●源图像。
●处理后图像。
●函数原型
○c。
○Android。
●参数解释
○image:输入图像:8bit,灰度图
○rho:生成极坐标的像素扫描步长。
○theta:生成极坐标的角度步长,一般是π180。
○threshold:要检测一条直线所需最少的的曲线交点。
○minLineLength:默认值0,表示最低线段的长度,比这个设定参数短的线段就不能被显现出来。
●c中。
●Android中。
霍夫变换(HoughTranorm)是图像处理领域中,从图像中识别几何形状的基本方法之一。主要识别具有某些相同特征的几何形状,例如直线,圆形,本篇博客的目标就是从黑白图像中识别出直线。
首先找到相对的资料,打开该地址clevErschool.coM。
下面是一个数学小白对原理的学习经验。
教材说:众所周知,一条直线在图像二维空间可由两个变量表示。
一开始难道要学习笛卡尔坐标系,不,你低估小白的能力了,我第一个查询的是θ读作西塔,是一个希腊字母。
什么是笛卡尔坐标系。
这个比较简单,直角坐标系。
斜率和截距。
斜率,亦称角系数,表示一条直线相对于横坐标轴的倾斜程度。
一条直线与某平面直角坐标系横坐标轴正半轴方向的夹角的正切值即该直线相对于该坐标系的斜率。
如果直线与x轴互相垂直,直角的正切直无穷大,故此直线不存在斜率。
对于一次函数y=kxb,k就是该函数图像的斜率。
在学习的时候,也学到如下内容。
截距:对x的截距就是y=0时,x的值,对y的截距就是x=0时,y的值,
截距就是直线与坐标轴的交点的横(纵)坐标。x截距为a,y截距b,截距式就是:xayb=1(a≠0且b≠0)。
斜率:对于任意函数上任意一点,其斜率等于其切线与x轴正方向所成的角,即k=tanα。axbyc=0中,k=ab。
什么是极坐标系。
重点学到下面这个结论就行。
找资料的时候,发现一个解释的比较清楚的博客,后续可以继续学习使用。
继续阅读资料,看到如下所示的图,这个图也出现在了很多解释原理的博客里面,但是图下面写了一句话。
在这里直接蒙掉了,怎么就表示成极坐标系了上面这个公式依旧是笛卡尔坐标系表示直线的方式,只是把k和b的值给替换掉了。
为何是这样的,具体原因可以参照下图。
继续寻找关于霍夫变换的资料,找到一个新的概念霍夫空间。
在笛卡尔坐标系中,一条直线可以用公式表示,其中k和b是参数,表示的是斜率和截距。
接下来将方程改写为,这时就建立了一个基于kb的笛卡尔坐标系。
此时这个新的方程在kb坐标系也有一个新的直线。
你可以在纸上画出这两个方程对应的线和点,如下图所示即可。
新的kb坐标系就叫做霍夫空间,这时得到一个结论,图像空间xy中的点对应了霍夫空间kb中的一条直线,即图像空间的点与霍夫空间的直线发生了对应关系。
如果在图像空间xy中在增加一个点,那相应的该点在霍夫空间也会产生相同的点与线的对应关系,并且A点与B点产生的直线会在霍夫空间相交于一个点。而这个点的坐标值就是直线AB的参数。
上述的内容没有问题,但是存在一种情况是,当直线趋近于垂直时,斜率k会趋近于无穷大,这时就没有办法转换了,解决办法是使用法线来表示直线。
上文提及的斜截式如下。
通过第二个公式,可以得到下述公式。
此时,我们可以带入一些数值进行转换。
图像空间有如下的几个点。
转换后的函数,都可以在霍夫空间θρ(横坐标是θ,纵坐标是ρ)进行表示。
原理这时就比较清晰了。
希望今天的1个小时(今天内容有点多,不一定可以看完),你有所收获,我们下篇博客见。
技术专栏。
逗趣程序员。
霍夫变换(HoughTranorm)
在看下面一个问题:我们要从一幅图像中检测出半径以知的圆形来。这个问题比前一个还要直观。我们可以取和图像平面一样的参数平面,以图像上每一个前景点为圆心,以已知的半径在参数平面上画圆,并把结果进行累加。最后找出参数平面上的峰值点,这个位置就对应了图像上的圆心。在这个问题里,图像平面上的每一点对应到参数平面上的一个圆。
I=rgb2gray(RGB);%图片用的是灰度图像,
x,y=size(I);
BW=edge(I);
rhomax=floor(sqrt(x2y2))1;%由原图数组坐标算出ρ最大值,并取整数部分加1
%此值作为ρ,θ坐标系ρ最大值
accarray=zeros(rhomax,180);%定义ρ,θ坐标系的数组,初值为0。
%θ的最大值,180度
Theta=0:pi180:pi;%定义θ数组,确定θ取值范围
forn=1:x,
form=1:y
ifBW(n,m)==1
fork=1:180
%将θ值代入hough变换方程,求ρ值
rho=(mcos(Theta(k)))(nsin(Theta(k)));
%将ρ值与ρ最大值的和的一半作为ρ的坐标值(数组坐标),这样做是为了防止ρ值出现负数
rhoint=round(rho2rhomax2);
%在ρθ坐标(数组)中标识点,即计数累加
accarray(rhoint,k)=accarray(rhoint,k)1;
end
%figure;colormapgray;
%=====下面程序的显示效果没上面好=====%
%axison,axisnormal,holdon;
%=======利用hough变换提取直线======%
%寻找100个像素以上的直线在hough变换后形成的点
K=1;%存储数组计数器
forrhon=1:rhomax%在hough变换后的数组中搜索
forthetam=1:180
ifaccarray(rhon,thetam)>=10%设定直线的最小值。
caseaccarrayn(K)=rhon;%存储搜索出的数组下标
caseaccarraym(K)=thetam;
K=K1;
%把这些点构成的直线提取出来,输出图像数组为Iout
Iout=zeros(x,y);
Ijiaoclass=zeros(x,y);
%如果正在计算的点属于100像素以上点,则把它提取出来
fora=1:K1
ifrhoint==caseaccarrayn(a)&k==caseaccarraym(a)%%%==gai==%%%k==caseaccarraym(a)&rhoint==caseaccarrayn(a)
Iout(n,m)=BW(n,m);
Ijiaoclass(n,m)=k;
%========hough变换=========%
%=====matlab自带函数========%
%入口图像为BW,出口图像为H
%axison,axisnormal,holdon。
直线:检测直线的霍夫变换使用含极坐标参数的直线表示型式简称极坐标式(不是极坐标方程,因为还是在笛卡尔坐标下表示)——。