OpenCV-Python官方教程-19-Hough直线变换和Hough圆环变换

1 .Hough直线变换

1.1 cv2.HoughLines()

在 OpenCV 中都被封装进了一个函数:cv2.HoughLines()。返回值就是(ρ, θ)。ρ 的单位是像素,θ 的单位是弧度。这个函数的第一个参数是一个二值化图像,所以在进行霍夫变换之前要首先进行二值化,或者进行Canny 边缘检测。第二和第三个值分别代表 ρ 和 θ 的精确度。第四个参数是阈值,只有累加其中的值高于阈值时才被认为是一条直线,也可以把它看成能检测到的直线的最短长度(以像素点为单位)。演示代码:

import cv2
import numpy as np

img = cv2.imread('xiangqi.jpg')
gray = cv2.imread('xiangqi.jpg',0)

edges = cv2.Canny(gray,50,150,apertureSize=3)
lines = cv2.HoughLines(edges,1,np.pi/180,200)

for i in range(len(lines)):
    for rho,theta in lines[i]:
        a = np.cos(theta)
        b = np.sin(theta)
        x0 = a*rho
        y0 = b*rho
        x1 = 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)
        
cv2.imshow('111',img)
cv2.waitKey(0)
cv2.destroyAllWindows()

在这里插入图片描述

1.2 cv2.HoughLinesP()

Probabilistic_Hough_Transform 是对霍夫变换的一种优化。它不会对每一个点都进行计算,而是从一幅图像中随机选取(是不是也可以使用图像金字塔呢?)一个点集进行计算,对于直线检测来说这已经足够了。但是使用这种变换我们必须要降低阈值(总的点数都少了,阈值肯定也要小呀!)。

OpenCV 中使用的 Matas, J. ,Galambos, C. 和 Kittler, J.V. 提出的Progressive Probabilistic Hough Transform。这个函数是 cv2.HoughLinesP()。它有两个参数。(1)minLineLength - 线的最短长度。比这个短的线都会被忽略。(2)MaxLineGap - 两条线段之间的最大间隔,如果小于此值,这两条直线就被看成是一条直线。这个函数的返回值就是直线的起点和终点。代码演示:

import cv2
import numpy as np

img = cv2.imread('xiangqi.jpg')
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
deges = cv2.Canny(gray,50,150,apertureSize=3)

minLineLenghth = 100
maxLineGap = 10
lines = cv2.HoughLinesP(edges,1,np.pi/180,100,minLineLenghth,maxLineGap)

for i in range(len(lines)):
    for x1,y1,x2,y2 in lines[i]:
        cv2.line(img,(x1,y1),(x2,y2),(0,255,0),2)
cv2.imshow('222',img)
cv2.waitKey(0)
cv2.destroyAllWindows()

在这里插入图片描述

Hough圆环变换

1 cv2.HoughCircles()

代码演示:

import cv2
import numpy as np

img = cv2.imread('opencv.jpg',0)
gray = cv2.medianBlur(img,5)
cimg = cv2.cvtColor(img,cv2.COLOR_GRAY2BGR)

circles = cv2.HoughCircles(img,cv2.HOUGH_GRADIENT,1,20,param1 = 50,param2=50,minRadius=0,maxRadius=0)
circles = np.uint16(np.around(circles))

for i in circles[0,:]:
    cv2.circle(cimg,(i[0],i[1]),i[2],(0,255,0),2)
    cv2.circle(cimg,(i[0],i[1]),2,(0,0,255),3) 
    
cv2.imshow('detected circles',cimg)
cv2.waitKey(0)
cv2.destroyAllWindows()

在这里插入图片描述


霍夫变换原理:https://zhuanlan.zhihu.com/p/203292567

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值