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

opencv-python霍夫变换

时间:2023-07-30 17:55:45浏览次数:32  
标签:直线 img python 检测 cv2 霍夫 opencv np

1 霍夫线检测原理

霍夫变换常用来提取图像中的直线和圆等几何形状。

在笛卡尔坐标系中,直线可以表示为 y=kx+q  也就是说通过变量k,q可以确定一条直线,把直线写成关于k,q的函数,进行空间转换,转换后的空间称为霍夫空间。

也就是说:笛卡尔坐标系中的一条线对应了霍夫空间的一个点。反过来,霍夫空间的一条线对应了笛卡尔坐标系的一个点。

如果笛卡尔坐标系中的点共线,那么这些点在霍夫空间中对应的直线应该交于一点。

如果是判断多个点是否共线的话,就尽可能找霍夫空间中更多直线相交的点。即霍夫坐标空间中选择尽可能多的直线汇成的点,将其对应回笛卡尔坐标系中的直线,基本上可以完成直线检测。

但是如果是垂直于y轴的直线,比如x=2,那么k,q就不好确定了。为了解决这种情况,把笛卡尔坐标系转换到极坐标系是比较好的选择。

因此,只需要指知道霍夫空间中交点的位置,就可以得到原坐标系下的直线。

实现流程如下:

 

2 霍夫线检测

 opencv中霍夫线检测使用的api是 HoughLines(img,rho,theta,threshold)。检测的图像需要二值化或者进行canny边缘检测。threshold:阈值,只有高于阈值的累加器的值才是直线。

import cv2
import numpy as np

img = cv2.imread('./contours.png')
img_copy = img.copy()
img_gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)

edges =cv2.Canny(img_gray,50,150)   # canny边缘检测
cv2.imshow('edges',edges)

lines = cv2.HoughLines(edges,1,np.pi/180,100)  #霍夫直线检测,threshold越小,越容易检测到更多的直线
print(lines)

for line in lines:     # 将检测的直线绘制在图像上,注意是极坐标。
    rho,theta = line[0]
    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_copy,(x1,y1),(x2,y2),[0,0,255])  #绘制直线
    
cv2.imshow('img_hough',img_copy)
cv2.imshow('img',img)

cv2.waitKey(0)
cv2.destroyAllWindows()

检测结果如下:

 

3 霍夫圆检测

# 霍夫圆检测

import cv2
import numpy as np

img = cv2.imread('./circle.jpg')
img_gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
img_gray = cv2.medianBlur(img_gray,3)  #中值滤波

res_img = np.zeros(img.shape[:],np.uint8)
res_img[:] = 255
print(img.shape)

#edges = cv2.Canny(img_gray,50,150)  #不需要进行canny边缘检测,否则霍夫检测不出来圆,返回none

circles = cv2.HoughCircles(img_gray,cv2.HOUGH_GRADIENT,1,100,param2=50) #霍夫圆检测,返回圆心和半径的list

circles = np.int0(np.around(circles))  # 把结果转换为int整数

for i in circles[0,:]:
    cv2.circle(res_img,(i[0],i[1]),i[2],[0,0,255],2)  #根据检测的结果绘制圆
    
    

print(circles)

cv2.imshow('img',img)
cv2.imshow('res_img',res_img)
#cv2.imshow('edges',edges)

cv2.waitKey(0)
cv2.destroyAllWindows()

 检测结果如下:

 

标签:直线,img,python,检测,cv2,霍夫,opencv,np
From: https://www.cnblogs.com/libai123456/p/17591758.html

相关文章

  • python argparse—用于命令行选项、参数和子命令的解析器
    参考:https://docs.python.org/3/library/argparse.htmlargparse.ArgumentParser:创建Parser对象语法格式class argparse.ArgumentParser(prog=None, usage=None, description=None, epilog=None, parents=[], formatter_class=argparse.HelpFormatter, prefix_chars='-......
  • opencv顺时针,逆时针旋转视频并保存视频
    原视频代码importcv2#打开视频文件video=cv2.VideoCapture('inference/video/lianzhang.mp4')#获取原视频的宽度和高度width=int(video.get(cv2.CAP_PROP_FRAME_WIDTH))height=int(video.get(cv2.CAP_PROP_FRAME_HEIGHT))#创建视频编写器并设置输出视频参数fou......
  • python的内置方法
     类型判断issubclass首先,我们先看issubclass()这个内置函数可以帮我们判断x类是否是y类型的子类classBase:passclassFoo(Base):passclassBar(Foo):passprint(issubclass(Bar,Foo))#Trueprint(issubclass(Foo,Bar))#False......
  • Python报错 | xlrd.biffh.XLRDError Excel xlsx file; not supported
    报错信息Python加载xlsx文件时,遇到:xlrd.biffh.XLRDErrorExcelxlsxfile;notsupported错误原因报错翻译过来是:xlrd.biffh.xlrd错误:Excelxlsx文件;不受支持解决方案方法1:安装指定低版本的xlrd,执行下面的pip安装命令即可:pipinstallxlrd==1.2.0方法2:Excel另存为......
  • python数据分析师入门-学习笔记(第十节 数据获取)
    工具使用Anaconda官网下载安装一路next(默认就行)Chrome默认安装就行打开jupyternotebook打开anacondaprompt输入jupyternotebook系统自动打开一个网页快手掌握开发工具模式:代码模式markdown模式快捷键h查看所有快捷键esc编辑状态切换......
  • python数据分析师入门-学习笔记(第九节 爬虫的核心流程)
    学习链接:Python数据分析师入门爬虫的核心流程明确目标汽车成交量汽车评论信息汽车提车分享信息搜寻哪些网站或APP有我们要的资源汽车之家懂车帝易车分析数据所在位置,加载方式直接加载的额外的网络请求数据获取使用代码驱动APP或浏览器自己分析请求......
  • python数据分析师入门-学习笔记(第八节 python爬虫的准备工作)
    学习链接:Python数据分析师入门python爬虫的准备工作一台电脑尽量windows电脑语言环境编程语言爬虫并不是python独有Python开发环境Anaconda了解爬虫的实现和原理用代码去控制终端用代码直接发送请求CS(客户端服务器)/BS(浏览器服务器)模型CS/BS浏览......
  • python网站创建005:(接收数据)和(发送数据)
    目标:如何从前端接收数据?如何将数据发送到前端? 1.如何(接收数据)   2.如何(发送数据)?  ......
  • python数据分析师入门-学习笔记(第七节 爬虫如何搞钱)
    学习链接:Python数据分析师入门爬虫如何搞钱入职企业,找一份爬虫工程师的岗位抢购最火的茅台电商平台秒杀羊毛出自猪身上看小说(投放广告)引流比价购物助手点赞、收藏、刷粉丝、刷评论、刷播放量核心资源的整合......
  • python适配器模式
    classA:  defcost(self):    print('costa')​​classB:  defcost(self):    print('costb')​​classMyAdapter:​  def__init__(self,obj):    self.obj=obj​  defpay(self):    self.obj.cost()​​adt_a=MyAd......