最近雨下得很凶
【18】Hough
HoughLines_Demo.cpp
HoughCircle_Demo.cpp
原来学数字图像处理的时候
没好好理解这个
每次看到这个都头大
来好好学学吧
= =
众所周知, 一条直线在图像二维空间可由两个变量表示.
例如:
在 笛卡尔坐标系: 可由参数: (m,b)斜率和截距表示.
在 极坐标系: 可由参数: (r,θ)极径和极角表示
对于霍夫变换, 我们将用 极坐标系 来表示直线.
y = ( - cosθ / sinθ ) *x +(r / sinθ)
化简得: r = x*cosθ + y*sinθ
如果对于一个给定点 (x,y) 我们在极坐标对极径极角平面绘出所有通过它的直线,
将得到一条正弦曲线.
如果两个不同点进行上述操作后得到的曲线在平面 θ - r 相交, 这就意味着它们通过同一条直线.
===============================================
这意味着一般来说,
一条直线能够通过在平面 θ - r 寻找交于一点的曲线数量来 检测.
越多曲线交于一点
也就意味着
这个交点表示的直线由更多的点组成.
一般来说我们可以通过设置直线上点的 阈值 来定义
多少条曲线交于一点我们才认为 检测 到了一条直线.
============================================
这就是霍夫线变换要做的.
它追踪图像中每个点对应曲线间的交点.
如果交于一点的曲线的数量超过了 阈值,
那么可以认为这个交点所代表的参数对 ( θ , r )在原图像中为一条直线.
标准霍夫线变换 HoughLines
和
统计概率霍夫线变换 HoughLinesP
标准霍夫线变换
它能给我们提供一组参数对 ( θ , r ) 的集合来表示检测到的直线
统计概率霍夫线变换
这是执行起来效率更高的霍夫线变换. 它输出检测到的直线的端点 (x0,y0,x1,y1)
步骤:
加载图片
用Canny算子对图像进行边缘检测
标准霍夫线变换
vector<Vec2f> lines;
HoughLines(dst, lines, 1, CV_PI/180, 100, 0, 0 );
变量:
dst: 边缘检测的输出图像. 它应该是个灰度图 (但事实上是个二值化图)
lines: 储存着检测到的直线的参数对 θ 的容器 * rho : 参数极径 r 以像素值为单位的分辨率.
我们使用 1 像素.
theta: 参数极角 θ 以弧度为单位的分辨率. 我们使用 1度 (即CV_PI/180)
threshold: 要”检测” 一条直线所需最少的的曲线交点
srn and stn: 参数默认为0.
统计概率霍夫线变换
vector<Vec4i> lines;
HoughLinesP(dst, lines, 1, CV_PI/180, 50, 50, 10 );
变量:
dst: 边缘检测的输出图像. 它应该是个灰度图 (但事实上是个二值化图) * lines: 储存着检测到的直线的参数对 (x0,y0,x1,y1) 的容器
rho : 参数极径 r 以像素值为单位的分辨率. 我们使用 1 像素.
theta: 参数极角 θ 以弧度为单位的分辨率. 我们使用 1度 (即CV_PI/180)
threshold: 要”检测” 一条直线所需最少的的曲线交点
* minLinLength: 能组成一条直线的最少点的数量. 点数量不足的直线将被抛弃.
maxLineGap: 能被认为在一条直线上的亮点的最大距离.
首先, 你要执行变换:
通过画出检测到的直线来显示结果.
霍夫圆变换
霍夫梯度法, 也叫2-1霍夫变换(21HT),
它的原理依据是圆心一定是在圆上的每个点的模向量上,这些圆上点模向量的交点就是圆心,
第一步就是找到这些圆心,
这样三维的累加平面就又转化为二维累加平面.
第二步根据所有候选中心的边缘非0像素对其的支持程度来确定半径.
执行霍夫圆变换:
vector<Vec3f> circles;
HoughCircles( src_gray, circles, CV_HOUGH_GRADIENT, 1, src_gray.rows/8, 200, 100, 0, 0 );
函数带有以下自变量:
src_gray: 输入图像 (灰度图)
circles: 存储下面三个参数: 集合的容器来表示每个检测到的圆.
CV_HOUGH_GRADIENT: 指定检测方法. 现在OpenCV中只有霍夫梯度法
dp = 1: 累加器图像的反比分辨率
min_dist = src_gray.rows/8: 检测到圆心之间的最小距离
param_1 = 200: Canny边缘函数的高阈值
param_2 = 100: 圆心检测阈值.
min_radius = 0: 能检测到的最小圆半径, 默认为0.
max_radius = 0: 能检测到的最大圆半径, 默认为0
樓:我很白~所以我是小白鼠
千刀萬剮的下場啊!!
我有點密集恐懼癥,這個還好
有那麼一點 科技感
= =
看一下效率吧