Hough Transform 霍夫變換檢測直線

2023-10-12 00:18

本文主要是介绍Hough Transform 霍夫變換檢測直線,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

http://www.cnblogs.com/smartvessel/archive/2011/10/20/2218654.html

從理論到代碼,再從代碼到理論

(1)理論之通俗理解:

1.在圖像中檢測直線的問題,其實質是找到構成直線的所有的像素點。那麼問題就是從找到直線,變成找到符合y=mx+c的所有(x,y)的點的問題。

2.進行坐標系變化y=mx+c,變成c=-xm+b。直線上的點(x1,y1),在轉換坐標系後為一條直線。這個原理應該是高中的。

  

3.直線上每一個點在MC坐標系中都表現為直線,而且,這些直線都相交於一個點,(m,c)。找到所有點的問題,轉變為尋找直線的問題。

4.對於圖像中的每一個點,在MC坐標系中對應著很多的直線。找到直線的交點,就對應著找到圖像中的直線。

實際在使用這一原理的時候,不是采用直線的斜率和截距公式,而是用

如何實現:

1.       將θ角在-90度到90度的范圍裡,劃分為很多區間,對所有的像素點(x,y)在所有θ角的時候,求出ρ.從而累加ρ值出現的次數。高於某個閾值的ρ就是一個直線。

2.       這個過程就類似於如下一個二維的表格,橫坐標就是θ角,ρ就是到直線的最短距離。

橫坐標θ不斷變換,對於所有的不為0的像素點,計算出ρ,找到ρ在坐標(θ,ρ)的位置累加1.

3.       上圖中局部最大的就是找到的直線的θ和ρ的值。

(2) 具體代碼片段

for( ang = 0, n = 0; n < numangle; ang += theta, n++ ){tabSin[n] = (float)(sin(ang) * irho);tabCos[n] = (float)(cos(ang) * irho);}// stage 1. fill accumulatorfor( i = 0; i < height; i++ )for( j = 0; j < width; j++ ){if( image[i * step + j] != 0 )for( n = 0; n < numangle; n++ ){r = cvRound( j * tabCos[n] + i * tabSin[n] );r += (numrho - 1) / 2;accum[(n+1) * (numrho+2) + r+1]++;}}// stage 2. find local maximumsfor( r = 0; r < numrho; r++ )for( n = 0; n < numangle; n++ ){int base = (n+1) * (numrho+2) + r+1;if( accum[base] > threshold &&accum[base] > accum[base - 1] && accum[base] >= accum[base + 1] &&accum[base] > accum[base - numrho - 2] && accum[base] >= accum[base + numrho + 2] )sort_buf[total++] = base;}// stage 3. sort the detected lines by accumulator valueicvHoughSortDescent32s( sort_buf, total, accum );// stage 4. store the first min(total,linesMax) lines to the output bufferlinesMax = MIN(linesMax, total);scale = 1./(numrho+2);for( i = 0; i < linesMax; i++ ){CvLinePolar line;int idx = sort_buf[i];int n = cvFloor(idx*scale) - 1;int r = idx - (n+1)*(numrho+2) - 1;line.rho = (r - (numrho - 1)*0.5f) * rho;line.angle = n * theta;cvSeqPush( lines, &line );}


这篇关于Hough Transform 霍夫變換檢測直線的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/191868

相关文章

Verybot之OpenCV应用二:霍夫变换查找圆

其实我是想通过这个程序来测试一下,OpenCV在Verybot上跑得怎么样,霍夫变换的原理就不多说了,下面是程序: #include "cv.h"#include "highgui.h"#include "stdio.h"int main(int argc, char** argv){cvNamedWindow("vedio",0);CvCapture* capture;i

css-transform对position:fixed影响

在betterScroll尝试使用position:fixed固定首列,然而并不能实现固定。因为 bscroll / iscroll 是基于 transform 属性实现滚动的, 所以 iscroll 会通过实时修改元素的 transform 属性以达到滚动的效果。父元素如果存在 transform 属性,子元素的 position: fixed 属性无效。betterScroll有个 useTr

CSS-transform【上】(2D转换)【看这一篇就够了!!!】

目录 transform属性 transform的2D变换函数 transform的3D转换属性值 2D转换 translate位移 translate(x,y) x,y为px长度单位 x,y为%百分比 y值不写,默认为0 translateX(x)与translateY(y) translate与绝对定位结合实现元素水平垂直居中 scale(x,y) 百分比单位 sc

BM3D--Image Denoising by Sparse 3-D Transform-Domain Collaborative Filtering

系列文章目录 文章目录 系列文章目录前言稀疏三维变换域协同滤波图像去噪摘要1 引言2 分组和协作过滤A.分组B.按匹配分组C.协同过滤D.基于变换域收缩的协同过滤 3 算法结论 前言 论文地址 如果下载不了可以从 https://download.csdn.net/download/m0_70420861/89708940 获取 参考博客 :图像去噪算法:NL-Me

OpenCV学习笔记(24)关于hough变换中pt1、pt2点的确定

经过Hough线变换,可以得到一些线段集合,对于这些线段,每一条线段给的是两个值,在极坐标下面的极径和极角,那么如何画出这样的每条直线呢,可以用到line函数,但是line 函数中有两个参数需要确定,pt1和pt2。 如图所示: 因此有如下画图代码 for (i = 0; i < lines.size(); i++){fRho = lines[i][0];fThe

Pandas-高级处理(四):分组与聚合【分组:groupby、聚合统计:max/min/mean...、分组转换:transform、一般化Groupby方法:apply】【抛开聚合只谈分组没意义】

df.groupby(by=None, axis=0, level=None, as_index=True, sort=True, group_keys=True, squeeze=False, **kwargs) 分组统计 - groupby功能 ① 根据某些条件将数据拆分成组 ② 对每个组独立应用函数 ③ 将结果合并到一个数据结构中 应用groupby和聚合函数实现数据的分组与聚合

短时傅里叶变换(Short-Time Fourier Transform, STFT),语音识别

高能预警!!! .wav文件为笔者亲自一展歌喉录制的噪声,在家中播放,可驱赶耗子,蟑螂 介绍 短时傅里叶变换(Short-Time Fourier Transform, STFT)是一种时频分析方法,用于分析非平稳信号的频率成分随时间的变化。与传统的傅里叶变换不同,STFT在处理信号时考虑了时间局部性,使得它能够同时在时间域和频率域上分析信号。 STFT的背景 傅里叶变换可以将信号从时间

【Opencv】Hough变换找直线和圆

目录 题目 解决方法 完整代码 Hough参数详解 总结 参考 题目 用霍夫变换找出图像中的直线和圆(用彩色直线和圆标记在原图上)。要求有代码,有注释,有过程、有结果   解决方法 # -*- coding: UTF-8 -*-import cv2import numpy as np# 1.加载图片,转为二值图img = cv2.imread('image.j

animation+transform实现轨迹平移

之前通过animation+transtion实现平移,transtion通过定义left和top值来移动; 其中 animation是定义一个动画,可以通过百分数来定义每个时刻的状态 基本的需要:  -webkit-animation-name: Aname; -webkit-animation-duration: 30s; 本次操作实现,太阳落山的轨迹,用了transform属性,可

前端3d动画-----平移 transform: translate3d()

必须加这个属性:transform-style: preserve-3d;    perspective: 900px;  设置了景深才能感到近大远小的感觉              <!DOCTYPE html><html lang="en"><head><meta charset="UTF-8"><meta http-equiv="X-UA-Compatible" co