霍夫变换函数
霍夫变换

‘IEEE Transactions on Pattern Recognition And Machine Intelligence’‘IEEE Transactions on Image Processing’是最重要的两本,其它的如ICCV、CVPR、ECCV、NIPS、BMVC等的会议文章也非常好。
最小二乘线性拟合算法、随机霍夫变换、局部霍夫变换、canny算子边缘检测、图像增强霍夫变换霍夫变换(Hough Transform)是图像处理中从图像中识别几何形状的基本方法之一,应用很广泛,也有很多改进算法。
主要用来从图像中分离出具有某种相同特征的几何形状(如,直线,圆等)。
最基本的霍夫变换是从黑白图像中检测直线(线段)。
详细内容我们先看这样一个问题:设已知一黑白图像上画了一条直线,要求出这条直线所在的位置。
我们知道,直线的方程可以用y=k*x+b 来表示,其中k和b是参数,分别是斜率和截距。
过某一点(x0,y0)的所有直线的参数都会满足方程y0=kx0+b。
即点(x0,y0)确定了一组直线。
方程y0=kx0+b在参数k--b平面上是一条直线(你也可以是方程b=-x0*k+y0对应的直线)。
这样,图像x--y平面上的一个前景像素点就对应到参数平面上的一条直线。
我们举个例子说明解决前面那个问题的原理。
设图像上的直线是y=x, 我们先取上面的三个点:A(0,0), B(1,1), C(2,2)。
可以求出,过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)。
应用这个性质就为我们解决问题提供了方法:首先,我们初始化一块缓冲区,对应于参数平面,将其所有数据置为0.对于图像上每一前景点,求出参数平面对应的直线,把这直线上的所有点的值都加1。
霍夫变换python

霍夫变换python霍夫变换是一种图像处理算法,用于检测图像中的直线、圆等形状。
因其具有较高的检测准确性和可靠性,被广泛应用于机器视觉、计算机图形学等领域。
本文将介绍Python 中常见的霍夫变换实现方法、应用场景和优化技巧。
1. HoughLinesHoughLines是Python中常用的霍夫变换函数,用于检测图像中的直线。
其输入是一个二值化图像(黑白图像),输出是一组(x,y)坐标值,代表图像中检测到的直线的位置。
使用示例:import cv2import numpy as npimg = cv2.imread('image.jpg')gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)edges = cv2.Canny(gray,50,150,apertureSize = 3)for i in range(len(lines)):rho,theta = lines[i][0]a = np.cos(theta)b = np.sin(theta)x0 = a*rhoy0 = b*rhox1 = int(x0 + 1000*(-b))y1 = int(y0 + 1000*(a))x2 = int(x0 - 1000*(-b))y2 = int(y0 - 1000*(a))cv2.line(img,(x1,y1),(x2,y2),(0,0,255),2)其中,edges是通过Canny边缘检测算法得到的二值化图像。
函数调用时,需要指定rho和theta的步长,以及阈值参数。
阈值参数用于控制检测到的直线的数量,调节该参数可以使得检测结果更加准确。
HoughLinesP是Python中另一个常用的霍夫变换函数,用于检测图像中的线段。
与HoughLines不同的是,HoughLinesP会返回一组线段的端点坐标(x1,y1),(x2,y2),而不是直线的参数rho和theta。
Houghtransform(霍夫变换)

Houghtransform(霍夫变换)主要内容:1、Hough变换的算法思想2、直线检测3、圆、椭圆检测4、程序实现⼀、Hough变换简介Hough变换是图像处理中从图像中识别⼏何形状的基本⽅法之⼀。
Hough变换的基本原理在于利⽤点与线的对偶性,将原始图像空间的给定的曲线通过曲线表达形式变为参数空间的⼀个点。
这样就把原始图像中给定曲线的检测问题转化为寻找参数空间中的峰值问题。
也即把检测整体特性转化为检测局部特性。
⽐如直线、椭圆、圆、弧线等。
霍夫变换于1962年由Paul Hough ⾸次提出[53],后于1972年由Richard Duda和Peter Hart推⼴使⽤[54],经典霍夫变换⽤来检测图像中的直线,后来霍夫变换扩展到任意形状物体的识别,多为圆和椭圆。
1.1 直线检测设已知⼀⿊⽩图像上画了⼀条直线,要求出这条直线所在的位置。
我们知道,直线的⽅程可以⽤y=k*x+b 来表⽰,其中k和b是参数,分别是斜率和截距。
过某⼀点(x0,y0)的所有直线的参数都会满⾜⽅程y0=kx0+b。
即点(x0,y0)确定了⼀族直线。
⽅程y0=kx0+b在参数k--b平⾯上是⼀条直线,(你也可以是⽅程b=-x0*k+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 Transform)是一种用来检测图像中的直线的算法,它在图像处理领域非常重要,它可以用来检测图像中的线条,圆和椭圆。
霍夫变换的基本原理是,将输入图像中的每个像素点看作是坐标系中的一个点,然后通过一些函数来确定是否存在直线,圆或椭圆,并将这些函数称为霍夫变换函数。
霍夫变换的直线检测是一个非常重要的过程,它的基本原理是将输入图像中的每个像素点看作是坐标系中的一个点,然后用霍夫变换函数来检测输入图像中是否存在直线。
霍夫变换函数有两种,一种是极坐标函数,另一种是直角坐标函数。
在极坐标函数中,霍夫变换函数的形式是:r=xcosθ+ysinθ,在直角坐标函数中,霍夫变换函数的形式是:y=mx+b。
霍夫变换直线检测的过程大致分为以下几步:首先,将输入图像转换为灰度图像,然后使用适当的滤波算法去除噪声;其次,使用边缘检测算法检测图像的边缘,并获得边缘的像素点坐标;然后,使用霍夫变换函数对边缘的像素点进行拟合,获得直线的参数;最后,使用拟合后的参数对直线进行绘制,完成图像中直线检测的任务。
总而言之,霍夫变换是一种用来检测图像中的直线的算法,它是一种极其重要的算法,它可以有效地检测图像中的线条,圆和椭圆,而其直线检测的原理是,将输入图像中的每个像素点看作是坐标系
中的一个点,然后使用霍夫变换函数拟合像素点,获得直线的参数,最后使用参数对直线进行绘制。
霍夫变换(详解)

基本原理
霍夫变换利用点和线之间的对偶性,将 图像空间中直线上离散的 像素点 通过参数方 程映射为霍夫空间中的 曲线 ,并将霍夫空间 中多条曲线的 交点 作为直线方程的参数 映射 为图像空间中的 直线。 给定直线的参数方程,可以利用霍夫变 换来检测图像中的直线。
原图
二值化
canny边缘检测
霍夫变换直线检测
谢谢!
给定具体的五个点:
(a)image space
(b)hough space
选择由尽可能多直线汇成的点,如A和B。
y=x-1 y=1 (a)image space (b)hough translation
A,B确定了两组参数(k,q),代入直线方程y=kx+q,况,
q q=-2k+4 q=-2k+3 q=-2k+1
(a)Image space q = -xk+y 无法确定图像空间中的垂线。
(b) hough space
k
转化为极坐标下的参数方程:
x1cosθ+y1sinθ=ρ
x1cosθ=ρcos2θ y1sinθ=ρsin2θ
图像空间中的点,对应了霍夫空间中的曲线。 曲线的交点确定了一组参数,能够描述图像空间中的特定直线。
给定具体的三个点:
y=x-1
(1,-1) (a)image space 图像空间中共线的点, 在霍夫空间对应的直线相交于一点。 (b)hough space
点和线的对偶性
(1)图像空间中的点,对应霍夫空间中的直 线。 (2)图像中的直线,对应霍夫空间中的点。 (3)共点的直线,在霍夫空间中对应的点在 一条直线上。 (4)共线的点,在霍夫空间中对应的直线交 与一点。
霍夫变换的基本理解(第八天)

霍夫变换的基本理解(第⼋天)千万注意:使⽤opencv⾃带的霍夫APIHoughLinesP():此函数输⼊的是⼀个⼆进制且⼋位的图像,例如:你不能⽤cvtcolor()变换之后直接输⼊。
HoughCircles():此函数输⼊的是⼀个灰度且⼋位的图像,例如:你不能经过threshold()、findcontours()等之后的图像进⾏输⼊。
我现在还不知道经过⼆值化的图像怎么转化为灰度图。
会了再补充。
---霍夫直线变换---源程序没有分析,只是分析了基本的原理。
等以后⽤到之后再进⾏分析⾸先回顾⼀下坐标系的概念--->>>1.直⾓坐标系(直线)<--->极坐标系(点),极坐标系(直线)<--->直⾓坐标系(点)。
相互对应的关系2.推导的公式很简单,看⼀下就懂了。
3.对于第三个公式,我们给定⼀个(x0,y0),就是图像的⼀个像素点(这个图是经过滤波、灰度、梯度等处理的),那么这个点在极坐标就可以画出⼀条直线。
因为在极坐标看的不明显,把这个函数画在直⾓坐标系显⽰(图⼀),就类似三⾓函数的图像。
现在我们再给定点(x1,y1)、(x2,y2)。
进⾏同样的⽅法画图(图⼆),这个点在直⾓坐标系就是⼀条直线,那么多重合的点,就说明很多的像素点在这个直线上,我们设定⼀个阈值L,当点的重合率⼤于这个阈值就认定是直线。
4.有点饶⼈,直⾓和极坐标相互的转化实现。
图⼀图⼆上⾯的原理是可以运⾏的:1.效率太低了,试想⼀下图像边缘⾮常的多,如果每⼀个像素点都进⾏计算的话,那太费时费事了。
2.线段的端点没办法检测。
3.对于相近的线段没办法区分。
HoughLinesP函数就是利⽤概率霍夫变换来检测直线的。
它的⼀般步骤为:1、随机抽取图像中的⼀个特征点,即边缘点,如果该点已经被标定为是某⼀条直线上的点,则继续在剩下的边缘点中随机抽取⼀个边缘点,直到所有边缘点都抽取完了为⽌;2、对该点进⾏霍夫变换,并进⾏累加和计算;3、选取在霍夫空间内值最⼤的点,如果该点⼤于阈值的,则进⾏步骤4,否则回到步骤1;4、根据霍夫变换得到的最⼤值,从该点出发,沿着直线的⽅向位移,从⽽找到直线的两个端点;5、计算直线的长度,如果⼤于某个阈值,则被认为是好的直线输出,回到步骤1。
opencv 广义霍夫变换

opencv 广义霍夫变换opencv 广义霍夫变换Opencv 广义霍夫变换(Generalized Hough Transform)是一种在图像中检测目标形状的方法,通过在不同的方向和角度上寻找形状的边缘,来识别目标形状。
以下是关于 Opencv 广义霍夫变换的详细内容。
1. 理解 Hough 变换Hough 变换是一种将数据从一种形式转换到另一种形式的过程,用于检测直线等几何形状。
霍夫变换将图像中的点转换为极坐标系中的直线,并用累加器数组表示每条直线。
当数据积累足够多时,累加器数组中的峰值就是检测到的直线。
2. 理解广义 Hough 变换广义 Hough 变换虽然基于 Hough 变换,但可以用于检测任意形状,而不仅仅是几何形状。
与 Hough 变换不同,广义 Hough 变换将图像中的点转换为另一种用于表示形状的坐标系,然后用累加器数组表示每个形状。
累加器数组中的峰值表示检测到的形状。
3. 广义 Hough 变换示例以下是通过 Opencv 广义霍夫变换检测一个三角形的示例。
a. 启用边缘检测使用 Canny 边缘检测算法来查找图像中的边缘。
b. 根据边缘创建形状模板使用 findContours 函数来查找图像中的轮廓,并通过approxPolyDP 函数来检测三角形。
将三角形转换为对应的坐标系。
c. 应用广义霍夫变换使用 GeneralizedHoughBallard 函数来检测三角形。
函数参数包括形状模板和阈值。
d. 检测三角形使用 minMaxLoc 函数来查找累加器数组中的峰值,并使用对应的坐标来获取检测到的三角形。
4. 总结Opencv 广义霍夫变换是一种非常有用的图像处理技术,可以检测各种形状,包括几何形状和非几何形状。
掌握广义霍夫变换可以帮助我们更好地理解图像处理和计算机视觉技术,在实际应用中也有很高的实用价值。
霍夫变换原理

霍夫变换原理霍夫变换是一种用于检测图像中特定形状的技术,它在计算机视觉和图像处理领域有着广泛的应用。
霍夫变换最初是由保罗·霍夫在1962年提出的,用于检测物体在图像中的位置和形状。
霍夫变换的原理是基于数学算法,通过将图像中的像素点映射到参数空间中,并在参数空间中进行累加来实现对特定形状的检测。
本文将介绍霍夫变换的原理及其在图像处理中的应用。
首先,我们来了解一下霍夫变换的基本原理。
在霍夫变换中,我们通常以直角坐标系中的一条直线为例进行说明。
对于直线上的每个点(x, y),我们可以通过以下公式将其映射到霍夫空间中的一条曲线,ρ = xcos(θ) + ysin(θ)。
其中,ρ表示直线到原点的距离,θ表示直线与x轴的夹角。
在霍夫空间中,每条直线都对应一条曲线,而交于同一点(ρ, θ)的曲线则表示一组共线的点,也就是在图像中共线的直线在霍夫空间中交于一点。
通过对霍夫空间中的曲线进行累加,我们可以找到交于同一点最多的曲线,从而确定图像中的直线。
除了检测直线外,霍夫变换也可以用于检测圆和其他形状。
对于圆,我们可以使用三个参数(ρ, α, β)来表示,其中ρ表示圆心到原点的距离,(α, β)表示圆心的坐标。
同样地,我们可以将图像中的圆映射到霍夫空间中的曲线,并通过累加找到交于同一点最多的曲线,从而确定图像中的圆。
在实际应用中,霍夫变换可以用于图像中的边缘检测、形状匹配、目标检测等领域。
例如,在边缘检测中,我们可以先通过Canny边缘检测算法找到图像中的边缘,然后利用霍夫变换来检测直线或圆。
在形状匹配中,我们可以将待匹配的形状映射到霍夫空间中,并通过对霍夫空间中的曲线进行匹配来实现形状的检测和识别。
在目标检测中,我们可以利用霍夫变换来检测图像中的特定形状,如车牌、圆形物体等。
总之,霍夫变换是一种强大的图像处理技术,它通过将图像中的特定形状映射到参数空间中,并在参数空间中进行累加来实现对特定形状的检测。
霍夫变换

霍夫变换一.概述霍夫变换是一种图像特征提取技术,是一种有效的快速准确地检测出直线或圆的方法,是基本的识别图像几何形状的方法之一。
二 . opencv中的霍夫变换1.Opencv支持的霍夫线变换有三种a)标准霍夫变换b)多尺度霍夫变换c)累计概率霍夫变换(标准霍夫变换的改进,效率更高)2.霍夫变换是从黑白图像中检测直线的,霍夫变换的直接输入只能是边缘二值图像,所以在使用霍夫变换之前要对图像进行边缘检测处理,3.HoughiLines:可调用标准霍夫变换HoughLines(a,b,c,d,e,f,g)a表示源图像b表示调用函数后得到的输出矢量(用来确定直线位置的矢量),一般默认写为“lines”c表示极坐标系中的ρd表示极坐标系中的角度θe表示阈值(指的是触发直线判断所需要的的最低值)f,g在使用标准霍夫变换时默认为04.HoughLinesP:可调用累计概率霍夫变换HoughLinesP(a,b,c,d,e,f,g)a表示源图像b表示调用函数后得到的输出矢量(用来确定直线位置的矢量),一般默认写为“lines”c表示极坐标系中的ρd表示极坐标系中的角度θe表示阈值(指的是触发直线判断所需要的的最低值)f,g在使用累计概率霍夫变换时默认为要为正值三 . 初期效果源代码#include <opencv2/opencv.hpp>#include <opencv2/imgproc/imgproc.hpp>using namespace cv;using namespace std;int main( ){while(1){VideoCapture capture(0);Mat srcImage;capture >> srcImage;//读取当前帧图片//【1】通过摄像头采取视频载入原始图和Mat变量定义Mat midImage,dstImage;//临时变量和目标图的定义//【2】进行边缘检测和转化为灰度图Canny(srcImage, midImage, 50, 200, 3);//canny边缘检测cvtColor(midImage,dstImage, COLOR_GRAY2BGR);//转化边缘检测后的图为灰度图//标准霍夫变换//【3】进行霍夫线变换vector<Vec2f> lines;//定义一个矢量结构lines用于存放得到的线段矢量集合HoughLines(midImage, lines, 1, CV_PI/180, 150, 0, 0 );//【4】依次在图中绘制出每条线段for( size_t i = 0; i < lines.size(); i++ ){float rho = lines[i][0], theta = lines[i][1];Point pt1, pt2;double a = cos(theta), b = sin(theta);double x0 = a*rho, y0 = b*rho;pt1.x = cvRound(x0 + 1000*(-b));pt1.y = cvRound(y0 + 1000*(a));pt2.x = cvRound(x0 - 1000*(-b));pt2.y = cvRound(y0 - 1000*(a));//此句代码的OpenCV2版为:(妙算所用版本我windows下搭建的是opencv3环境)//line( dstImage, pt1, pt2, Scalar(55,100,195), 1, CV_AA);//此句代码的OpenCV3版为:line( dstImage, pt1, pt2, Scalar(55,100,195), 1, LINE_AA);}//累计概率霍夫变换/*vector<Vec4i> lines;HoughLinesP(midImage, lines, 1, CV_PI/180, 80, 50, 10 );for(size_t i=0;i < lines.size();i++){Vec4i l = lines[i];line(dstImage, Point(l[0],l[1]),Point(l[2],l[3]),Scalar(186,88,255),1,LINE_AA);}*///【5】显示原始图imshow("【原始图】", srcImage);//【6】边缘检测后的图imshow("【边缘检测后的图】", midImage);//【7】显示效果图imshow("【效果图】", dstImage);//【8】延时40ms 然后读取下一帧waitKey(1);}return 0;}运行效果标准霍夫变换得到的图像累计概率霍夫变换得到的图像整体思路就是通过调用摄像头获取图像,然后调用Canny函数进行边缘检测,再调用cvtColor函数把边缘检测后的图像转化为灰度图,再调用霍夫变换函数即可检测直线。
【OpenCV入门教程之十四】OpenCV霍夫变换:霍夫线变换,霍夫圆变换合辑

本系列文章由@浅墨_毛星云出品,转载请注明出处。
文章链接: /poem_qianmo/article/details/26977557作者:毛星云(浅墨)微博:/u/1723155442知乎:/people/mao-xing-yun邮箱:happylifemxy@写作当前博文时配套使用的OpenCV版本: 2.4.9本篇文章中,我们一起探讨了OpenCV中霍夫变换相关的知识点,以及了解了OpenCV中实现霍夫线变换的HoughLines、HoughLinesP函数的使用方法,实现霍夫圆变换的HoughCircles函数的使用方法。
此博文一共有四个配套的简短的示例程序,其详细注释过的代码都在文中贴出,且文章最后提供了综合示例程序的下载。
先尝鲜一下其中一个示例程序的运行截图:一、引言在图像处理和计算机视觉领域中,如何从当前的图像中提取所需要的特征信息是图像识别的关键所在。
在许多应用场合中需要快速准确地检测出直线或者圆。
其中一种非常有效的解决问题的方法是霍夫(Hough)变换,其为图像处理中从图像中识别几何形状的基本方法之一,应用很广泛,也有很多改进算法。
最基本的霍夫变换是从黑白图像中检测直线(线段)。
这篇文章就将介绍OpenCV中霍夫变换的使用方法和相关知识。
二、霍夫变换概述霍夫变换(Hough Transform)是图像处理中的一种特征提取技术,该过程在一个参数空间中通过计算累计结果的局部最大值得到一个符合该特定形状的集合作为霍夫变换结果。
霍夫变换于1962年由PaulHough首次提出,最初的Hough变换是设计用来检测直线和曲线,起初的方法要求知道物体边界线的解析方程,但不需要有关区域位置的先验知识。
这种方法的一个突出优点是分割结果的Robustness,即对数据的不完全或噪声不是非常敏感。
然而,要获得描述边界的解析表达常常是不可能的。
后于1972年由Richard Duda & Peter Hart推广使用,经典霍夫变换用来检测图像中的直线,后来霍夫变换扩展到任意形状物体的识别,多为圆和椭圆。
matlab霍夫直线检测

matlab霍夫直线检测一、Matlab霍夫直线检测简介Matlab是一种常用的数学软件,其中霍夫直线检测是其重要功能之一。
霍夫直线检测是一种基于数学原理的图像处理方法,可以在图像中准确地检测出直线,并给出其位置和角度等信息。
在Matlab中,可以使用霍夫变换函数hough来实现直线检测。
二、Matlab霍夫直线检测的原理1. 霍夫变换霍夫变换是一种将坐标系上的点映射到参数空间中的方法。
在二维空间中,一个点(x,y)可以表示为极坐标(r,θ)形式,其中r为距离,θ为角度。
因此,在参数空间中,每个点都对应着一条直线。
对于所有图像中的点,它们在参数空间中的投影交于同一个点,则表示这些点共线。
2. 霍夫直线检测在Matlab中使用hough函数进行霍夫变换时,需要指定阈值和步长等参数。
阈值决定了哪些投票数高于该值的直线会被认为是有效的;步长则决定了参数空间网格大小。
首先需要进行边缘检测以获取图像边缘信息。
然后将边缘点在参数空间中投票,每个边缘点投出一条直线。
最后,在参数空间中找到投票数高于阈值的点,这些点对应的直线就是霍夫直线检测得到的结果。
三、Matlab霍夫直线检测的实现步骤1. 读入图像并进行灰度化和边缘检测使用imread函数读入图像,并使用rgb2gray函数将图像转换为灰度图像。
然后使用edge函数进行边缘检测,可以选择Sobel、Prewitt、Canny等算子。
2. 进行霍夫变换使用hough函数进行霍夫变换,需要指定参数空间网格大小和阈值等参数。
其中,网格大小决定了参数空间的精度,而阈值则决定了哪些直线会被认为是有效的。
3. 寻找直线使用houghpeaks函数在参数空间中寻找投票数最高的点,并使用houghlines函数将这些点转换为直线。
四、Matlab霍夫直线检测的应用场景1. 工业自动化领域:可以用于机器视觉系统中的物体识别和测量。
2. 地质勘探领域:可以用于地震数据分析和地质断层识别。
houghpeaks函数

houghpeaks函数HoughPeaks是一种图像处理算法,用于在霍夫变换中找到明显的峰值。
霍夫变换是一种用于检测直线、圆等形状的图像处理技术,它将原始图像转换为参数空间中的一组点,使得在该空间中的峰值表示了原始图像中的形状。
HoughPeaks将霍夫变换输出中的峰值作为输入,并返回一组坐标,这些坐标与原始图像中找到的形状相关联。
HoughPeaks的核心思想是找到霍夫变换输出的极大值。
霍夫变换输出的每个点都表示了一条直线或圆的参数。
如果这条直线或圆在原始图像中出现了多次,那么它在霍夫变换输出中对应的点就会比其他点更亮。
我们可以通过寻找这些亮点来找到原始图像中的形状。
为了实现这一目标,HoughPeaks算法中使用了两个参数:thresh和NhoodSize。
Thresh参数是一个阈值,用于确定哪些点应该被认为是峰值。
只有霍夫变换输出中的点亮度大于这个阈值,才被认为是峰值。
NhoodSize参数是一个邻域大小,用于定义一个点周围的邻域。
如果一个点是峰值,并且它的邻域内有其他点的亮度也大于thresh,则这些点被认为是属于同一峰值。
HoughPeaks算法的具体实现如下:1. 给定霍夫变换输出矩阵H。
2. 对于每个点(x,y)在H中,如果它的亮度大于thresh,则将其标记为峰值。
3. 对于每个峰值,检查它的邻域大小是否为NhoodSize。
如果是,则将它们归为同一峰值。
4. 返回所有峰值的坐标。
该算法在计算机视觉领域有广泛的应用,包括图像分割、形状检测以及模式识别等方面。
在实际应用中,参数thresh和NhoodSize的值需要根据具体的问题进行调整,以获得最佳的效果。
除了HoughPeaks算法以外,还有一些其他的霍夫变换的应用,例如霍夫直线变换和霍夫圆变换。
在霍夫直线变换中,一条直线可以表示为(x,y)坐标系中的极坐标(r,θ)。
通过建立一张(r,θ)空间的表格,计算Hough变换并找出极值,可以检测到原始图像中的直线。
霍夫变换

3.3.3 提取图形区域(Extracting Graphic Region )图形的描述相对较复杂,考虑到文档图象中常见的图形主要是直线,因此我们在实际处理中仅检测各方向的直线。
由于在文档的光电转换中,如扫描等,常会出现图象倾斜,Stuart 等[30]指出,进行倾斜校正会使压缩比提高1%左右,因此有必要对倾斜的图象进行校正。
同时,使原本水平和竖直的直线更加容易发现。
此外,在图象中除了水平和竖直的直线外,通常还会出现其它方向的直线。
为了能够检测到不是水平或竖直的直线,我们需要构造具有一定方向性的形态学算子。
在本文中,我们检测图象中的各直线段方向,然后构造相应的结构元素将其检测出。
(1) HOUGH 变换 在检测直线中,很容易想到利用Hough 变换[60]。
下面简单介绍Hough 变换。
直线y = mx + b 可用极坐标表示为:)sin()cos(θθy x r +=,也可表示为:yxtg y x r =++=)()sin(22ϕϕθ,其中 式(3.15)其中,(r ,θ)定义了一个从原点到该直线最近点的向量,显然,这个向量与该直线垂直。
如图3.7所示。
图3.7 直线的极坐标表示 Fig3.7 Polar Coordinates of a line考虑一个以参数r 和θ构成的二维空间。
x,y 平面的任意一直线对应了r,θ平面上的一个点。
因此,x,y 平面上的任意一直线的Hough 变换是r, θ平面上的一个点。
现在考虑x,y 平面的一个特定的点(x 0,y 0)。
过该点的直线可以有很多,每一条都对应了r, θ空间中的一个点。
然而这些点必须是满足以x 0,y 0作为常量时的等式。
因此在参数空间中与x,y空间中所有这些直线对应的点的轨迹是一条正弦型曲线,即x,y平面上的任一点对应了r,θ平面上的一条正弦曲线。
式(3.15)也说明其正弦的函数关系。
如果有一组位于由参数r0和θ0决定的直线上的边缘点,则每个边缘点对应了r,θ空间的一条正弦型曲线。
matlab霍夫变换

matlab霍夫变换一、什么是霍夫变换?霍夫变换(Hough Transform)是一种图像处理算法,用于检测图像中的直线、圆等形状。
其基本思想是将图像中的每个点转化为参数空间中的一个曲线或点,然后在参数空间中寻找交叉点,从而得到目标形状的参数。
二、Matlab中的霍夫变换函数在Matlab中,可以使用“hough”函数进行霍夫变换。
该函数的语法如下:[H,theta,rho] = hough(BW)其中,“BW”是二值化后的图像矩阵,“H”是霍夫变换后的结果矩阵,“theta”和“rho”分别表示直线参数空间中的角度和距离。
三、Matlab实现直线检测1. 读取并显示原始图像首先需要读取原始图像,并将其显示出来。
可以使用“imread”和“imshow”函数实现。
2. 二值化处理由于霍夫变换只能处理二值化后的图像,因此需要对原始图像进行二值化处理。
可以使用“im2bw”函数实现。
3. 霍夫变换使用“hough”函数对二值化后的图像进行霍夫变换,并得到直线参数空间矩阵“H”。
4. 寻找直线在直线参数空间矩阵“H”中,寻找交叉点即可得到直线的参数。
可以使用“houghpeaks”函数实现。
5. 绘制直线利用得到的直线参数,可以使用“houghlines”函数绘制出检测到的直线。
四、Matlab实现圆检测1. 读取并显示原始图像同样需要先读取原始图像,并将其显示出来。
2. 灰度化处理由于霍夫变换只能处理灰度图像,因此需要对原始图像进行灰度化处理。
可以使用“rgb2gray”函数实现。
3. 边缘检测利用“edge”函数对灰度化后的图像进行边缘检测,得到边缘图像。
4. 霍夫变换使用“houghcircles”函数对边缘图像进行霍夫变换,并得到圆形参数空间矩阵“centers”。
5. 绘制圆形利用得到的圆形参数,可以使用“viscircles”函数绘制出检测到的圆形。
五、总结Matlab中提供了丰富的霍夫变换函数,可以方便地实现直线、圆等形状的检测。
霍夫变换

Image Processing Toolbox histeq houghlineshoughHough transformSyntax[H, theta, rho] = hough(BW)[H, theta, rho] = hough(BW, param1, val1, param2, val2)Description[H, theta, rho] = hough(BW) computes the Standard Hough Transform (SHT) of the binary image BW. You can use the hough function to detect lines in an image. The function returns H, the Hough transform matrix. theta (in degrees) and rho are the arrays of rho and theta values over which the Hough transform matrix was generated.[H, theta, rho] = hough(BW, param1, val1, param2, val2) specifies parameter/value pairs, listed in the following table. Parameter names can be abbreviated, and case does not matter.ParameterDescription'ThetaResolution'Real scalar value between 0 and 90, exclusive, that specifies the spacing (in degrees) of the Hough transform bins along the theta axis. Default: 1.'RhoResolution'Real scalar value between 0 and norm(size(BW)), exclusive, that specifies the spacing of the Hough transform bins along the rho axis. Default: 1NotesThe hough function implements the Standard Hough Transform (SHT). The SHT uses the parametric representation of a line:rho = x*cos(theta) + y*sin(theta)The variable rho is the distance from the origin to the line along a vector perpendicular to the line.theta is the angle between the x-axis and this vector. The hough function generates a parameter space matrix whose rows and columns correspond to rho and theta values respectively. Peak values in this space represent potential lines in the input image.The Hough transform matrix, H, is NRHO-by-NTHETA where NRHO = 2*ceil(norm(size(BW))/RhoResolution)-1, and NTHETA = 2*ceil(90/ThetaResolution). Theta angle values are in the range [-90, 90) degrees and rho values range from -DIAGONAL to DIAGONAL where DIAGONAL = RhoResolution*ceil(norm(size(BW))/RhoResolution). Note that if 90/DTHETA is not an integer, the actual angle spacing will be 90/ceil(90/DTHETA). Class SupportBW can be logical or numeric and it must be real, 2-D, and nonsparse.ExamplesCompute and display the Hough transform of an imageRGB = imread('gantrycrane.png');I = rgb2gray(RGB); % convert to intensityBW = edge(I,'canny'); % extract edges[H,T,R] = hough(BW,'RhoResolution',0.5,'ThetaResolution',0.5);% display the original imagesubplot(2,1,1);imshow(RGB);title('gantrycrane.png');% display the hough matrixsubplot(2,1,2);imshow(imadjust(mat2gray(H)),'XData',T,'YData',R,...'InitialMagnification','fit');title('Hough transform of gantrycrane.png');xlabel('\theta'), ylabel('\rho');axis on, axis normal, hold on;colormap(hot);See alsohoughpeaks, houghlineshisteq histeq houghlines houghlines? 1984-2007 The MathWorks, Inc. ? Terms of Use ? Patents ? Trademarks ? Acknowledgmentsfunction[I2,center]=FindCircle(I0) %函数功能close all %清除内存I0=imread('001.BMP'); %读取图像,实验时为一圆形硬币I=uint8(I0)figure,imshow(I)level = graythresh(I); %自动阈值二值化BW = im2bw(I,level);figure,imshow(BW);P=3000; %除去小于一定面积的指定区域BW2 = bwareaopen(BW,P);figure,imshow(BW2);BW3 = bwmorph(BW2,'dilate'); %图像形态学操作figure,imshow(BW3);BW4 = bwmorph(BW3,'remove');figure, imshow(BW4);[I2,center]=Hughcir(BW4); %调用Hughcir(img)函数figure,imshow(I2);%调用函数如下:文件夹命名为Hughcir.mfunction[I2,center]=Hughcir(I)[r c]=size(I);%defining max &min values for radiusrmax=272;rmin=271;PL=zeros(r,c,rmax-rmin+1);for rad=rmin:rmaxk=1;% creating a circle for given radiusfor theta=1:360x=rad*cosd(theta);y=rad*sind(theta);X(k)=floor(x+.5);Y(k)=floor(y+.5);k=k+1;endfor i=1:3:rfor j=1:3:cif(I(i,j)==1)Xi=X+i;Yj=Y+j;index=find((Xi>=rad)&(Yj>=rad)&(Xi<=r-rad)&(Yj<=c-rad));[rr cc]=size(index);P1=logical(zeros(r,c));for l=1:ccP1(Xi(index(l)),Yj(index(l)))=1;endPL(:,:,rad-rmin+1)=PL(:,:,rad-rmin+1)+P1(:,:);endendendendma=max(max(max(PL)));[r c1 p]=find(PL==ma);pag=floor(c1/c);ac=c1-(c*pag);I2=logical(zeros(size(I)));nrad=pag+rmin;center(1)=r(1);center(2)=ac(1);for theta=1:.2:360x=nrad(1)*cosd(theta);y=nrad(1)*sind(theta);Xn=r(1)+floor(x+.5);Yn=ac(1)+floor(y+.5);I2(Xn,Yn)=1;endfunction [hough_space,hough_circle,para] = hough_circle(BW,step_r,step_angle,r_min,r_max,p)% %%%%%%%%%%%%%%%%%%%%%%%%%%% input% BW:二值图像;% step_r:检测的圆半径步长% step_angle:角度步长,单位为弧度% r_min:最小圆半径% r_max:最大圆半径% p:阈值,0,1之间的数% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% output% hough_space:参数空间,h(a,b,r)表示圆心在(a,b)半径为r的圆上的点数% hough_circl:二值图像,检测到的圆% para:检测到的圆的圆心、半径[m,n] = size(BW);size_r = round((r_max-r_min)/step_r)+1;size_angle = round(2*pi/step_angle);hough_space = zeros(m,n,size_r);[rows,cols] = find(BW);ecount = size(rows);% Hough变换% 将图像空间(x,y)对应到参数空间(a,b,r)% a = x-r*cos(angle)% b = y-r*sin(angle)for i=1:ecountfor r=1:size_rfor k=1:size_anglea = round(rows(i)-(r_min+(r-1)*step_r)*cos(k*step_angle));b = round(cols(i)-(r_min+(r-1)*step_r)*sin(k*step_angle));if(a>0&a<=m&b>0&b<=n)hough_space(a,b,r) = hough_space(a,b,r)+1;endendendend% 搜索超过阈值的聚集点max_para = max(max(max(hough_space)));index = find(hough_space>=max_para*p);length = size(index);hough_circle = false(m,n);for i=1:ecountfor k=1:lengthpar3 = floor(index(k)/(m*n))+1;par2 = floor((index(k)-(par3-1)*(m*n))/m)+1;par1 = index(k)-(par3-1)*(m*n)-(par2-1)*m;if((rows(i)-par1)^2+(cols(i)-par2)^2<(r_min+(par3-1)*step_r)^2+5&...(rows(i)-par1)^2+(cols(i)-par2)^2>(r_min+(par3-1)*step_r)^2-5)hough_circle(rows(i),cols(i)) = true;endendend% 打印检测结果for k=1:lengthpar3 = floor(index(k)/(m*n))+1;par2 = floor((index(k)-(par3-1)*(m*n))/m)+1;par1 = index(k)-(par3-1)*(m*n)-(par2-1)*m;par3 = r_min+(par3-1)*step_r;fprintf(1,'Center %d %d radius %d\n',par1,par2,par3);para(:,k) = [par1,par2,par3];endfunction [hough_space,hough_circle,para] = hough_circle(BW,step_r,step_angle,r_min,r_max,p)% %%%%%%%%%%%%%%%%%%%%%%%%%%% input% BW:二值图像;% step_r:检测的圆半径步长% step_angle:角度步长,单位为弧度% r_min:最小圆半径% r_max:最大圆半径% p:阈值,0,1之间的数% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% output% hough_space:参数空间,h(a,b,r)表示圆心在(a,b)半径为r的圆上的点数% hough_circl:二值图像,检测到的圆% para:检测到的圆的圆心、半径[m,n] = size(BW);size_r = round((r_max-r_min)/step_r)+1;size_angle = round(2*pi/step_angle);hough_space = zeros(m,n,size_r);[rows,cols] = find(BW);ecount = size(rows);% Hough变换% 将图像空间(x,y)对应到参数空间(a,b,r)% a = x-r*cos(angle)% b = y-r*sin(angle)for i=1:ecountfor r=1:size_rfor k=1:size_anglea = round(rows(i)-(r_min+(r-1)*step_r)*cos(k*step_angle));b = round(cols(i)-(r_min+(r-1)*step_r)*sin(k*step_angle));if(a>0&a<=m&b>0&b<=n)hough_space(a,b,r) = hough_space(a,b,r)+1;endendendend% 搜索超过阈值的聚集点max_para = max(max(max(hough_space)));index = find(hough_space>=max_para*p);length = size(index);hough_circle = false(m,n);for i=1:ecountfor k=1:lengthpar3 = floor(index(k)/(m*n))+1;par2 = floor((index(k)-(par3-1)*(m*n))/m)+1;par1 = index(k)-(par3-1)*(m*n)-(par2-1)*m;if((rows(i)-par1)^2+(cols(i)-par2)^2<(r_min+(par3-1)*step_r)^2+5&...(rows(i)-par1)^2+(cols(i)-par2)^2>(r_min+(par3-1)*step_r)^2-5) hough_circle(rows(i),cols(i)) = true;endendend% 打印检测结果for k=1:lengthpar3 = floor(index(k)/(m*n))+1;par2 = floor((index(k)-(par3-1)*(m*n))/m)+1;par1 = index(k)-(par3-1)*(m*n)-(par2-1)*m;par3 = r_min+(par3-1)*step_r;fprintf(1,'Center %d %d radius %d\n',par1,par2,par3);para(:,k) = [par1,par2,par3];endclear all;clc; %清屏I = imread('tupian.jpg'); %读入图像figure;imshow(I);I =im2bw(I); %将图像二值化[y,x]=find(I); %找出I中非零元素的位置[sy,sx]=size(I);figure;%找出I的行和列的大小,赋值给sy,sximshow(I); %显示Itotalpix = length(x);HM = zeros(sy,sx,50);R = 1:50;R2 = R.^2;sz = sy*sx; %矩阵I的所有元素的总和tic;%计时for cnt = 1:totalpixfor cntR = 1:50b = 1:sy;a = (round(x(cnt) - sqrt(R2(cntR) - (y(cnt) - [1:sy]).^2))); %a=x-genhao(r^2-(y-b)^2);b = b(imag(a)==0 & a>0); %求出满足条件(imag(a)==0 & a>0)的一系列的a,b值a = a(imag(a)==0 & a>0);ind = sub2ind([sy,sx],b,a); %求出数组[sy,sx]中的圆心[b,a]的单下标。
霍夫变换的原理

霍夫变换的原理概述霍夫变换(Hough Transform)是一种图像处理中常用的算法,主要用于在图像中检测几何形状的存在以及对其进行分割和参数估计。
它是由霍夫于1962年提出的,通过一系列数学变换来将图像中的直线或者圆等曲线进行检测和提取。
霍夫变换的基本原理霍夫变换的基本原理是将空间坐标的点转换到参数空间中的曲线,通过对曲线在参数空间内的交点进行统计,就可以检测出图像中的特定形状。
主要包括以下几个步骤:1.边缘检测:首先对图像进行边缘检测,将图像中的边缘提取出来。
这可以使用Canny算子等边缘检测算法来实现。
2.构建霍夫空间:对于图像中的每个边缘点,在参数空间内生成曲线。
对于直线检测而言,曲线可以用参数表示:极坐标方程 r = x * cos(theta) + y* sin(theta),其中 (x, y) 是边缘点的坐标,(r, theta) 是参数空间中的点。
3.统计霍夫空间:对霍夫空间内的曲线进行统计,找到交点最多的曲线,它们所代表的直线或者圆形状就是图像中的目标。
通过统计算法,可以找到这些曲线在霍夫空间内的峰值。
4.参数估计:根据霍夫空间内的统计结果,可以得到目标的参数估计。
对于直线检测而言,可以得到直线的斜率和截距;对于圆的检测而言,可以得到圆心的坐标和半径。
霍夫变换的应用领域霍夫变换广泛应用于图像处理和计算机视觉的领域,主要包括以下几个方面:直线检测霍夫变换可以用于检测图像中的直线。
由于直线的数学表示存在一定的困难,直接从图像中提取直线是比较复杂的。
通过将直线的参数转换到霍夫空间内,就可以通过统计算法来检测图像中的直线。
圆检测霍夫变换也可以用于检测图像中的圆。
与直线检测类似,将圆的参数转换到霍夫空间内,通过统计算法找到霍夫空间内的峰值,就可以检测出图像中的圆。
图像分割在图像分割中,霍夫变换可以用于将图像中的目标对象与背景进行分离。
通过检测目标对象所对应的曲线,在霍夫空间内找到峰值,就可以划分出目标对象的区域。
霍夫变换(Hough)

霍夫变换(Hough)⼀、霍夫变换(Hough) A-基本原理⼀条直线可由两个点A=(X1,Y1)和B=(X2,Y2)确定(笛卡尔坐标)另⼀⽅⾯,也可以写成关于(k,q)的函数表达式(霍夫空间):对应的变换可以通过图形直观表⽰:变换后的空间成为霍夫空间。
即:笛卡尔坐标系中⼀条直线,对应霍夫空间的⼀个点。
反过来同样成⽴(霍夫空间的⼀条直线,对应笛卡尔坐标系的⼀个点):再来看看A、B两个点,对应霍夫空间的情形:⼀步步来,再看⼀下三个点共线的情况:可以看出如果笛卡尔坐标系的点共线,这些点在霍夫空间对应的直线交于⼀点:这也是必然,共线只有⼀种取值可能。
如果不⽌⼀条直线呢?再看看多个点的情况(有两条直线):其实(3,2)与(4,1)也可以组成直线,只不过它有两个点确定,⽽图中A、B两点是由三条直线汇成,这也是霍夫变换的后处理的基本⽅式:选择由尽可能多直线汇成的点。
看看,霍夫空间:选择由三条交汇直线确定的点(中间图),对应的笛卡尔坐标系的直线(右图)。
到这⾥问题似乎解决了,已经完成了霍夫变换的求解,但是如果像下图这种情况呢?k=∞是不⽅便表⽰的,⽽且q怎么取值呢,这样不是办法。
因此考虑将笛卡尔坐标系换为:极坐标表⽰。
在极坐标系下,其实是⼀样的:极坐标的点→霍夫空间的直线,只不过霍夫空间不再是[k,q]的参数,⽽是的参数,给出对⽐图:是不是就⼀⽬了然了?给出霍夫变换的算法步骤:对应code:1 function [ Hough, theta_range, rho_range ] = naiveHough(I)2 %NAIVEHOUGH Peforms the Hough transform in a straightforward way.3 %4 [rows, cols] = size(I);56 theta_maximum = 90;7 rho_maximum = floor(sqrt(rows^2 + cols^2)) - 1;8 theta_range = -theta_maximum:theta_maximum - 1;9 rho_range = -rho_maximum:rho_maximum;1011 Hough = zeros(length(rho_range), length(theta_range));12for row = 1:rows13for col = 1:cols14if I(row, col) > 0 %only find: pixel > 015 x = col - 1;16 y = row - 1;17for theta = theta_range18 rho = round((x * cosd(theta)) + (y * sind(theta))); %approximate19 rho_index = rho + rho_maximum + 1;20 theta_index = theta + theta_maximum + 1;21 Hough(rho_index, theta_index) = Hough(rho_index, theta_index) + 1;22 end23 end24 end25 end其实本质上就是:交点怎么求解呢?细化成坐标形式,取整后将交点对应的坐标进⾏累加,最后找到数值最⼤的点就是求解的,也就求解出了直线。
霍夫变换函数

霍夫变换函数:hough;houghpeaks;houghlines(1)(2014-03-31 11:50:36)转载▼分类:matlab图像处理工具箱提供了三个与霍夫变换有关的函数。
函数hough实现了前面讨论的概念,函数houghpeaks寻找霍夫变换的峰值(累加单元的高计数),函数houghlines以来自其他两个函数的结果为基础在原始图像中提取线段。
1. 函数hough函数hough支持任意的默认语法:[H, theta, rho] = hough(f)还支持完整的语法形式:[H, theta, rho] = hough(f, 'ThetaRes', val1, 'RhoRes', val2)其中,H是霍夫变换矩阵,theta(以度计)和rho是ρ和θ值向量,在这些值上产生霍夫变换。
输入f是二值图像,val1是0到90的标量,指定了沿θ轴霍夫变换的间距(默认是1),val2是0例10.5 霍夫变换的说明在这个例子中,我们用简单的合成图像来说明hough函数的机理:>> f = zeros(101, 101);>> f(1, 1) = 1; f(101, 1) = 1; f(1, 101) = 1;>> f(101, 101) = 1; f(51, 51) = 1;图10-10(a)显示了我们的测试图像,下面使用默认值计算并显示霍夫变换的结果:>> H = hough(f)>> Imshow(H,[])图10-10(b)显示了结果,以熟悉的方法使用imshow函数来显示。
在带有标度轴的较大图中显现霍夫变换常常更有用。
在接下来的代码片段中,我们调用带有三个参数的hough函数。
然后把向量theta和rho作为附加输入参量传递给imshow,从而控制水平轴和垂直轴的标度。
我们还要把'InitialMagnification'选项传递给带有值'fit'的imshow函数,因此,整个图像将被强迫在图形窗口中进行装配。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
霍夫变换函数:hough;houghpeaks;houghlines(1)(2014-03-31 11:50:36)转载▼分类:matlab图像处理工具箱提供了三个与霍夫变换有关的函数。
函数hough实现了前面讨论的概念,函数houghpeaks寻找霍夫变换的峰值(累加单元的高计数),函数houghlines以来自其他两个函数的结果为基础在原始图像中提取线段。
1. 函数hough函数hough支持任意的默认语法:[H, theta, rho] = hough(f)还支持完整的语法形式:[H, theta, rho] = hough(f, 'ThetaRes', val1, 'RhoRes', val2)其中,H是霍夫变换矩阵,theta(以度计)和rho是ρ和θ值向量,在这些值上产生霍夫变换。
输入f是二值图像,val1是0到90的标量,指定了沿θ轴霍夫变换的间距(默认是1),val2是0例10.5 霍夫变换的说明在这个例子中,我们用简单的合成图像来说明hough函数的机理:>> f = zeros(101, 101);>> f(1, 1) = 1; f(101, 1) = 1; f(1, 101) = 1;>> f(101, 101) = 1; f(51, 51) = 1;图10-10(a)显示了我们的测试图像,下面使用默认值计算并显示霍夫变换的结果:>> H = hough(f)>> Imshow(H,[])图10-10(b)显示了结果,以熟悉的方法使用imshow函数来显示。
在带有标度轴的较大图中显现霍夫变换常常更有用。
在接下来的代码片段中,我们调用带有三个参数的hough函数。
然后把向量theta和rho作为附加输入参量传递给imshow,从而控制水平轴和垂直轴的标度。
我们还要把'InitialMagnification'选项传递给带有值'fit'的imshow函数,因此,整个图像将被强迫在图形窗口中进行装配。
axis 函数被用来打开轴标记,并使其显示填充图的矩形框。
最后,xlabel和ylabel函数(见2.3.1节)用希腊字母LaTeX字体符号在轴上标值:>> [H, theta, rho] = hough(f);>> imshow(H, [], 'XData', theta, 'YData', rho ,'InitialMagnification', 'fit') >> axis on, axis normal>> xlabel('\theta'), ylabel('\rho')图10-10(c)显示了标上值之后的结果。
三条曲线(直线也可考虑为曲线)在±45°处的交点指出:f中有两组三个共线的点。
两条曲线在(ρ,θ)=(0,-90)、(-100,-90)、(0,0)和(100,0)处的交点指出:有4组位于垂直线和水平线上的共线点。
2. 函数houghpeaks线检测和连接用的霍夫变换的第一步是用高的计数寻找累加单元(工具箱文本把高的计数单元作为峰值)。
因为存在霍夫变换参数空间中的量化和典型图像的边缘并不是很完美的直线这样的事实,霍夫变换的峰值倾向于相比霍夫变换单元更多。
函数houghpeaks用任意默认语法来寻找指定的峰值数:peaks = houghpeaks(H, NumPeaks)或者使用完整的语法形式:peaks = houghpeaks(..., 'Threshold', val1, 'NHoodSize', val2)其中,"…"指出来自默认语法和peaks的输入是持有峰值行和列坐标的Q×2大小的矩阵。
Q的范围是0到NumPeaks,H是霍夫变换矩阵。
参数val1是非负的标量,指定了H中的什么值被考虑为峰值;val1可以从0到Inf变化,默认值是0.5*max(H(:))。
参数val2是奇整数的两元素矢量,指定量围绕峰值的邻域大小。
当鉴别出峰值之后,邻域中的元素被置为0。
默认是由最小奇数值组成的两元素矢量大于或等于size(H)/50。
这个过程的基本思想是:通过把发现峰值的直接邻域中的霍夫变换单元置0来清理峰值。
我们在例10.6中说明函数houghpeaks。
3. 函数houghlines一旦一组候选的峰值在霍夫变换中被识别出来,如果存在与这些峰值相关的有意义的线段,剩下的就是决定线的起始点和终点。
函数houghlines 用默认的语法执行这个任务:lines = houghlines(f, theta, rho, peaks)或者使用完整的语法形式:lines = houghlines(..., 'FillGap', val1, 'MinLength', val2)其中,theta和rho是来自函数hough的输出,peaks是函数houghpeaks 的输出。
输出lines是结构数组(可能检测到多条直线),长度等于找到的线段数。
结构中的每个元素可以看成一条线,并含有下列字段:point1:两元素向量[r1, c1],指定了线段起点的行列坐标。
point2:两元素向量[r2, c2],指定了线段终点的行列坐标。
theta:与线相关的霍夫变换的以度计量的角度。
rho:与线相关的霍夫变换的ρ轴位置。
其他参数如下:val1是正的标量,指定了与相同的霍夫变换相关的两条线段的距离。
当两条线段之间的距离小于指定的值时,函数houghlines把线段合并为一条线段(默认的距离是20个像素)。
参数val2是正的标量,指定合并的线是保留还是丢弃。
如果合并的线比val2指定的值短,就丢弃(默认值是40)。
例10.6 用霍夫变换检测和连接线在这个例子中,我们用函数hough、houghpeaks和houghlines寻找图10-7(f)所示二值图像f的一组线段。
首先,我们用比默认值更好的角间距(用0.2代替1.0)计算和显示霍夫变换:>> [H, theta, rho] = hough(f, 'ThetaResolution', 0.2);>> imshow(H, [], 'XData', theta, 'YData', rho, 'InitialMagnification', 'fit') >> axis on, axis normal>> xlabel('\theta'), ylabel('\rho')下一步,我们用函数houghpeaks寻找5个有意义的霍夫变换的峰值:>> peaks = houghpeaks(H, 5);>> hold on>> plot(theta(peaks(:, 2)), rho(peaks(:, 1)), ...'linestyle', 'none', 'marker', 's', 'color', 'w')前边的操作计算和显示霍夫变换,并添加使用函数houghpeaks的默认设置寻找到的5个峰值位置。
图10-11(a)显示了结果。
例如,最左边较小的方形确定与房顶相关的累加单元,以工具箱的角度作为参考倾向于近似-74°,在图10-9(a)中是-16°。
最后,我们使用函数houghlines寻找和连接线段,用函数imshow、hold on和plot在原始的二值图像上添加线段:>> lines = houghlines(f, theta, rho, peaks);>> figure, imshow(f), hold on>> for k = 1:length(lines)xy = [lines(k).point1 ; lines(k).point2];plot(xy(:,1), xy(:,2), 'LineWidth', 4, 'Color', [.8 .8 .8]);end图10-11(b)显示了使用检测到的叠加了较粗灰线的线段得到的结果。
完整示例:1.f=imread('w2.tif');2.figure(1)3.imshow (f);title('The Original image')4.level=graythresh(f);5.f=im2bw(f);6.[H, theta, rho] = hough(f, 'ThetaResolution', 0.2);7.figure(2)8.imshow(H, [], 'XData', theta, 'YData', rho, 'InitialMagnification', 'fit')9.axis on, axis normal10.hold on11.xlabel('\theta'), ylabel('\rho')12.peaks = houghpeaks(H,2);%检测2个峰值点13.plot(theta(peaks(:, 2)), rho(peaks(:, 1)), ...14.'linestyle', 'none', 'marker', 's', 'color', 'w')15.title('The peak point location')16.lines = houghlines(f, theta, rho, peaks);17.figure(3)18.imshow(f), hold on19.for k = 1:length(lines)20. xy=[lines(k).point1 ; lines(k).point2];21. plot(xy(:,1), xy(:,2), 'LineWidth', 4, 'Color', [.7 .7 .7]);22.end23.title('Hough-transformation result')结果:。