霍夫检测(直线,圆)

数学原理:霍夫变换

1.直线检测

数学原理(个人观点):简单来说,就是把直角坐标与极坐标之间做变换,通过点映射直线,通过遍历所有像素点,极坐标曲线交点便是检测到的可能直线。
api:
1.标准霍夫变换,输入二值图像

cv.HoughLines(image, rho, theta, threshold[, lines[, srn[, stn[, min_theta[, max_theta]]]]]) → lines

几个常用参数解释:
image:8位,单通道二进制源图像。
lines:输出直线向量,两个元素的向量(ρ,θ)代表一条直线,ρ是从原点(图像的左上角)的距离,θ是直线的角度(单位是弧度),0表示垂直线,π/2表示水平线
rho:距离步长
theta:角度步长
threshold:阈值,只有大于该值的点才有可能被当作极大值,即至少有多少条正弦曲线交于一点才被认为是直线

简单调参:
rho一般取1,theta取pi/180,阈值可调,其它默认即可

注:函数返回lines为三维数组,为每个直线的极坐标交点的极径,极角,可通过公式解算出直线端点进行绘制

完整源码:

def line_detection():#直线检测(霍夫变换),噪声敏感
    img = cv.imread('C:\\Users\\Lin Xi\\Desktop\\OpenCV\\road.jpg')
    img2 = np.copy(img)
    #dst = cv.GaussianBlur(img,(5,5),0)#优先选择ksize,ksize为0,通过sigmaX解算ksize,sigma一般取5~25
    cv.imshow('road',img)
    dst = cv.Canny(img,150,300,apertureSize = 3)
    cv.imshow('edges',dst)
    lines = cv.HoughLines(dst,1,np.pi/180,230,None,0,0)#标准霍夫变换,输入二值图像
    if lines is not None:
        for i in range(len(lines)):
            rho = lines[i][0][0]
            theta = lines[i][0][1]
            a = math.cos(theta)
            b = math.sin(theta)
            x0 = a * rho
            y0 = b * rho
            pt1 = (int (x0 + 1000 * (-b)),int(y0 + 1000 *a))
            pt2 = (int (x0 - 1000 * (-b)),int(y0 - 1000 *a))
            cv.line(img,pt1,pt2,(0,0,255),2,8,0)
    cv.imshow('hough',img)

效果图:


直线检测.JPG

2.累计概率霍夫变换,输入二值图像

cv.HoughLinesP(image, rho, theta, threshold[, lines[, minLineLength[, maxLineGap]]]) → lines

常用参数解释:
跟上个api参数基本类似
minLineLength:最低线长度。较短的线段被拒绝。
maxLineGap:同一直线上各点之间的最大允许间隔,以连接它们。
用min和max作门限,钳住检测到的直线,参数可根据实际调整

注:函数返回三维数组,最后一维依次为每条直线的端点坐标值

完整源码:

def line_detection():#直线检测不能是灰度只能是二值,虽然官方文档显示输入8bit单通道图像
    img = cv.imread('C:\\Users\\Lin Xi\\Desktop\\OpenCV\\road.jpg')
    img2 = np.copy(img)
    #dst = cv.GaussianBlur(img,(5,5),0)#优先选择ksize,ksize为0,通过sigmaX解算ksize,sigma一般取5~25
    cv.imshow('road',img)
    dst = cv.Canny(img,150,300,apertureSize = 3)
    cv.imshow('edges',dst)    
    linesp = cv.HoughLinesP(dst,1,np.pi/180,100,None,50,10)#累计概率霍夫变换,输入二值图像
    if linesp is not None:
        for i in range(len(linesp)):
            l = linesp[i][0]
            cv.line(img2,(l[0],l[1]),(l[2],l[3]),(0,0,255),2,8,0)
    cv.imshow('hough p',img2)

效果图:


直线检测.JPG

最后强调,霍夫检测api均对噪声敏感,噪点会被直接参与检测算法,因此要事先做好滤波

2.圆检测

数学原理:跟直线检测原理类似,但圆检测为三维坐标(x0,y0,r),不能像二维霍夫直线检测那样对于多个边缘点越多这些点对应的三维空间曲线交于一点那么他们经过的共同圆上的点就越多,算法复杂度过高,这里采用霍夫梯度法
api:

cv.HoughCircles(image, method, dp, minDist[, circles[, param1[, param2[, minRadius[, maxRadius]]]]]) → circles

常用参数解释:
image:单通道灰度图(直线检测必须是二值图)
method:定义检测图像中圆的方法。设为cv.HOUGH_GRADIENT即可
minRadius:半径的最小大小(以像素为单位)
maxRadius:半径的最大大小(以像素为单位)
min和max作用类似于上述直线检测,两个param均为经验值

完整源码:

def circle_detection():#霍夫圆检测,输入灰度非二值图像
    img = cv.imread('C:\\Users\\Lin Xi\\Desktop\\OpenCV\\circle.jpg')
    cv.imshow('input',img)
    gray = cv.cvtColor(img,cv.COLOR_BGR2GRAY)
    rows,cols = img.shape[:2]
    circles = cv.HoughCircles(gray,cv.HOUGH_GRADIENT,1,rows/4,None,param1 = 100,param2 = 30,minRadius = 20,maxRadius = 150)
    if circles is not None:
        for i in circles[0,:]:
            center = (i[0],i[1])
            radius = i[2]
            cv.circle(img,center,2,(0,255,0),-1,8,0)
            cv.circle(img,center,radius,(0,255,255),2,8,0)
    cv.imshow('circle',img)

效果图:


圆检测.JPG
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,324评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,303评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,192评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,555评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,569评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,566评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,927评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,583评论 0 257
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,827评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,590评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,669评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,365评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,941评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,928评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,159评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,880评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,399评论 2 342

推荐阅读更多精彩内容