\tutorial_code\ImgTrans






最近雨下得很凶

【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




樓:我很白~所以我是小白鼠




千刀萬剮的下場啊!!




我有點密集恐懼癥,這個還好








有那麼一點 科技感

= = 



看一下效率吧



  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值