首页 > 编程语言 >opencv-python 4.13. 霍夫线变换

opencv-python 4.13. 霍夫线变换

时间:2023-04-06 18:33:32浏览次数:58  
标签:直线 4.13 python 检测 变换 霍夫 opencv theta cv

前言

霍夫变换是一种特征检测(feature extraction),被广泛应用在图像分析(image analysis)、计算机视觉(computer vision)以及数位影像处理(digital image processing)。

霍夫变换(Hough Transform)是图像处理中的一种特征提取技术,它通过一种投票算法检测具有特定形状的物体。该过程在一个参数空间(parameter space)中,通过计算累计空间(accumulator space)中局部最大值(local maximum)得到一个符合该特定形状的集合作为霍夫变换结果。霍夫变换于1962年由Paul Hough 首次提出,后于1972年由Richard Duda和Peter Hart推广使用,经典霍夫变换用来检测图像中的直线,后来霍夫变换扩展到任意形状物体的识别,多为圆和椭圆。

什么是霍夫变换直线检测

Hough直线检测的基本原理在于利用点与线的对偶性,在我们的直线检测任务中,即图像空间中的直线与参数空间中的点是一一对应的,参数空间中的直线与图像空间中的点也是一一对应的。这意味着我们可以得出两个非常有用的结论:

  • 图像空间中的每条直线在参数空间中都对应着单独一个点来表示。
  • 图像空间中的直线上任何一部分线段在参数空间对应的是同一个点。

因此Hough直线检测算法就是把在图像空间中的直线检测问题转换到参数空间中对点的检测问题,通过在参数空间里寻找峰值来完成直线检测任务。

霍夫变换直线检测原理详解

对于直角坐标系中的任意一点A(x0 , y0),经过点A的直线满足y = mx + c(m是斜率,c是截距),那么在x−y平面过点A(x0,y0)的直线族可以用y0 = mx0 + c 表示,但对于垂直于x轴的直线斜率是无穷大的则无法表示。为此,将直角坐标系转换到极坐标系就能解决该特殊情况。

在极坐标系中,表示直线的方程为ρ = xcosθ + ysinθ(ρ为原点到直线的距离),如下图1所示:
image
图1 直线方程极坐标表示

现利用霍夫变换直线检测原理对上图进行分析,为方便接下来对上图的分析,将上图进行数据形象化表示如下图2所示
image
图2 直线数据形象化表示

image
表1 直线方程参数确定

image

OpenCV中的霍夫变换

在 OpenCV 中提供了两个霍夫直线检测的函数,一个是标准霍夫变换,另一个是概率霍夫变换。先学习一下标准霍夫变换吧,该变化方式也叫做多尺度霍夫变换。该方法使用的函数是 cv2.HoughLines,函数原型如下
lines = cv2.HoughLines(image, rho, theta, threshold[, lines[, srn[, stn[, min_theta[, max_theta]]]]])
参数说明:

  • image:输入 8 位灰度图像;
  • rho:生成极坐标时像素扫描步长;
  • theta:生成极坐标时候的角度步长;
  • threshold:阈值;
  • lines:返回值,极坐标表示的直线;
  • sen:是否应用多尺度的霍夫变换,如果不是设置 0 表示经典霍夫变换;
  • stn:是否应用多尺度的霍夫变换,如果不是设置 0 表示经典霍夫变换;
  • min_theta:角度扫描范围最小值;
  • max_theta:角度扫描范围最大值。

该函数的返回值是( θ,ρ ),其中 ρ 的单位是像素, θ 的单位是弧度。

import cv2 as cv
import numpy as np

img = cv.imread(r'C:\Users\yuyalong\Pictures\Saved Pictures\build.jpg')
gray_img = cv.cvtColor(img, cv.COLOR_BGR2GRAY)

# 直方图均衡
dst = cv.equalizeHist(gray_img)
# 高斯滤波降噪
# gaussian = cv.GaussianBlur(dst, (9, 9), 0)
# cv.imshow("gaussian", gaussian)

# 边缘检测
edges = cv.Canny(dst, 50, 200)
cv.imshow("edges", edges)

# Hough 直线检测
# 重点注意第四个参数 阈值,只有累加后的值高于阈值时才被认为是一条直线,也可以把它看成能检测到的直线的最短长度(以像素点为单位)
# 在霍夫空间理解为:至少有多少条正弦曲线交于一点才被认为是直线
lines = cv.HoughLines(edges, 1.0, np.pi / 180, 200)

for line in lines:
    # line[0]存储的是点到直线的极径和极角,其中极角是弧度表示的,theta是弧度
    rho, theta = line[0]
    a = np.cos(theta)
    b = np.sin(theta)
    x0 = a * rho
    y0 = b * rho

    # 下图 1000 的目的是为了将线段延长
    # 以 (x0,y0) 为基础,进行延长
    x1 = int(x0 + 1000 * (-b))
    y1 = int(y0 + 1000 * (a))
    x2 = int(x0 - 1000 * (-b))
    y2 = int(y0 - 1000 * (a))
    cv.line(img, (x1, y1), (x2, y2), (255, 255, 0), 2)

cv.imshow("src", img)
cv.waitKey()

image

参考博客:

标签:直线,4.13,python,检测,变换,霍夫,opencv,theta,cv
From: https://www.cnblogs.com/yimeimanong/p/17293590.html

相关文章

  • Python字节
    python的文件操作中,一个中文字符等于3个字节。1B(byte,字节)=8bit(位)1KB(Kilobyte,千字节)=1024B =(10的3次方)B1MB(Megabyte,兆字节,百万字节,简称“兆”)=1024KB = (10的6次方)B1GB(GB,吉字节,千兆) = 1024MB1TB(TB,万亿字节,太字节) = 1024GB1PB(PB,千万亿字节,拍字节) ......
  • CS50-Python实验5,6
    Week5UnitTestsTestingmytwittr题目描述:测试ProblemSet2中Settingupmytwttr程序;题解:twttr.pydefmain():print("Output:",shorten(input("Input:")))defshorten(word):ans=""foriinword:ifi.lowe......
  • python系列007
    //使用类进行设备控制类文件内容importpyvisaimportnumpyasnpimporttimeclassPiDevice:def__init__(self):self.device_id=None#默认无设备连接deffind_device_address(self,device_id):rm=pyvisa.ResourceMa......
  • 20230406-Python-if判断-day4
    条件语句4月6场景假设:网吧上网去⽹吧进⻔想要上⽹必须做的⼀件事是做什么?(考虑重点)为什么要把身份证给⼯作⼈员?是不是就是为了判断是否成年?是不是如果成年可以上⽹?如果不成年则不允许上⽹?其实这⾥所谓的判断就是条件语句,即条件成⽴执⾏某些代码,条件不成⽴则不执⾏这些......
  • Python学习——Day1
      学习python与C语言相似,第一件事也是输出一个”HelloWorld"。  但是相比C语言,python的输出要简洁好多,他没有换行符\n也能自动换行,print()函数里字符串无论是使用单引号还是双引号结果都能正常输出且输出结果一样。  第二个就是注释,python则与C语言不同,这里用到......
  • 【Python从零到壹】Python条件语句详解
    欢迎大家来到互联网老辛的专栏《Python从零到壹》,在这里我将分享约300篇Python系列文章,所有文章都将结合案例、代码和作者的经验讲解,真心想把自己近十年的编程经验分享给大家,希望对您有所帮助,文章中不足之处也请海涵。从事教学工作以来,越来越觉得时间的宝贵,每届学生都要讲重复的课,......
  • 关于python安装模块之后pychram仍然提示没有安装模块的问题
    项目场景:如图所示:需要安装的包已经安装好,但是到了pycharm里就没法使用,相信很多小伙伴遇到过这个问题。原因分析:遇到这个问题的主要原因是你的电脑里安装了两个pycharm解释器,你安装后,实际上是安装到了你电脑的Python3而非pycharm解释器。解决方案:所以我们可以在pycharm里面直......
  • C++,OpenCV-颜色模型转换(4)
    HSV颜色模型HSV模型HSV(Hue,Saturation,Value)根据颜色直观特性创建的一种颜色空间,也称六角锥体模型(HexconeModel),参数分别为色调(H),饱和度(S),明度(V)色调H用角度度量,取值范围为0°~360°,从红色开始按逆时针方向计算,红色为0°,绿色为120°,蓝色为240°。它们的补色是:黄色为60°,青色为180°......
  • python requests-html
    #pipinstallrequests-html '''目标网站:https://pic.netbian.com'''fromrequests_htmlimportHTMLSessionimportre,osimportrequestsfromtqdmimporttqdmfromfunctoolsimportpartialfrommultiprocessingimportPools......
  • python系列006
    先使用一个文件控制设备importtime#importpyvisafrompimiimportPiDevicedevice=PiDevice("ASRL3::INSTR")#创建实例,并手动写入地址参数,可以借助NIMax读取whoisPower=device.PiPower()#调用类中的方法,电源地址#Sendacommandtotheinstrument#......