霍夫变换(直线和圆)Hough Transform原理详解--Bing

本文介绍了霍夫变换的基本原理,包括直线和圆的检测方法,并提供了使用OpenCV在Python中的示例代码,展示了如何通过边缘检测和参数调整进行霍夫变换的应用。最后,讨论了代码封装以简化参数调用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

文章目录

  • 前言
  • 一、霍夫变换原理
  • 二、霍夫变换详解
    • 1.霍夫直线变换
    • 2.霍夫圆变换
    • 3.霍夫变换在Opencv中的应用
  • 三、源代码
  • 四、代码封装
  • 总结


前言

随着人工智能的不断发展,机器学习这门技术也越来越重要,很多人都开启了学习机器学习,本文就介绍了机器学习的基础内容霍夫变换。

一、霍夫变换原理

       霍夫变换运用两个坐标空间之间的变换,将在一个空间中具有相同形状的曲线或直线映射到另一个坐标空间的一个点上形成峰值,从而把检测任意形状的问题转化为统计峰值问题

二、霍夫变换讲解

三、源代码

1、霍夫直线代码

import cv2 as cv
import numpy as np
import matplotlib.pyplot as plt#Matplotlib是RGB
#导入图片
image = cv.imread('picture1.jpg')
#转换为灰度图
grayImage = cv.cvtColor(image,cv.COLOR_BGR2GRAY)
#高斯模糊
gaussionImage = cv.GaussianBlur(grayImage, (9,9),0)
#边缘检测
edgesImage =cv.Canny(gaussionImage,50,135)
#霍夫直线检测
linesNumpy = cv.HoughLines(edgesImage,1.1,np.pi/180,150)
#绘制直线,将极坐标点(ρ,θ)转化成之直线
imageLines = image.copy()
for line in linesNumpy:
    rho, theta = line[0]
    a = np.cos(theta)
    b = np.sin(theta)
    x0 = rho * a
    y0 = rho * b
    # 找两个点
    x1 = int(x0 + 1000 * (-b))
    y1 = int(y0 + 1000 * a)
    x2 = int(x0 - 1000 * (-b))
    y2 = int(y0 - 1000 * a)
    cv.line(imageLines, (x1, y1), (x2, y2), (0, 0, 255), 3)
titles = ['OriginalImage',  'gaussionImage', 'edgesImage', 'imageLines']
images = [image,  gaussionImage, edgesImage, imageLines]

for i in range(4):
    plt.subplot(2, 2, i + 1), plt.imshow(images[i], 'gray')
    plt.title(titles[i])
    plt.xticks([]), plt.yticks([])
plt.show()h

2、霍夫圆代码

import cv2 as cv
import numpy as np
import matplotlib.pyplot as plt#Matplotlib是RGB
#导入图片
image = cv.imread('picture1.jpg')
#转换为灰度图
grayImage = cv.cvtColor(image,cv.COLOR_BGR2GRAY)
#边缘检测
edgesImage =cv.Canny(grayImage,100,105)
#高斯模糊
gaussionImage = cv.GaussianBlur(edgesImage, (7,7),0)
circles1 = cv.HoughCircles(gaussionImage,cv.HOUGH_GRADIENT,dp=1,minDist=15,param1=130,param2=14,minRadius=15,maxRadius=21)
circles = np.uint16(np.around(circles1))
circleImage = image.copy()
for circle in circles[0,:]:
    cv.circle(circleImage,(circle[0],circle[1]),circle[2],(255,0,0),2)
    cv.circle(circleImage,(circle[0],circle[1]),2,(0,255,0),2)
titles = ['OriginalImage',  'gaussionImage', 'edgesImage', 'circleImage']
images = [image,  gaussionImage, edgesImage, circleImage]

for i in range(4):
    plt.subplot(2, 2, i + 1), plt.imshow(images[i], 'gray')
    plt.title(titles[i])
    plt.xticks([]), plt.yticks([])
plt.show()

四、代码封装

目的:python+qt封装后方便调参

总结

以上是我在学习霍夫变换原理后的理解和总结,综合整理了一下网上的知识所得。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值