OpenCV自学笔记十九:霍夫变换

目录

1、霍夫直线变换

2、霍夫圆环变换


1、霍夫直线变换

霍夫直线变换(Hough Line Transform)是一种用于在图像中检测直线的技术。它能够从图像中提取出直线的参数,例如直线的斜率和截距。

霍夫直线变换的基本原理是在参数空间中累加直线的交点。对于每个图像中的边缘点,它们代表了可能的直线候选。通过对这些候选直线进行计数,可以找到在参数空间中累积计数最高的直线,从而得到图像中的直线。

示例:

下面是一个使用OpenCV实现霍夫直线变换的简单示例代码:

复制代码
import cv2

import numpy as np

# 读取图像并转换为灰度图像

img = cv2.imread('image.jpg')

gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

# 进行边缘检测

edges = cv2.Canny(gray, 50, 150, apertureSize=3)

# 进行霍夫直线变换

lines = cv2.HoughLines(edges, 1, np.pi/180, threshold=100)

# 绘制检测到的直线

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, (x1, y1), (x2, y2), (0, 0, 255), 2)

# 显示结果

cv2.imshow('Image', img)

cv2.waitKey(0)

cv2.destroyAllWindows()

在上述示例中,我们首先使用`cv2.imread()`函数读取图像,并将其转换为灰度图像。

然后,我们使用`cv2.Canny()`函数进行边缘检测,以提取图像中的边缘。

接下来,使用`cv2.HoughLines()`函数进行霍夫直线变换。该函数接受四个参数:边缘图像、距离分辨率、角度分辨率和阈值。在本例中,我们设置了距离分辨率为1像素、角度分辨率为1度,并将阈值设置为100。

然后,对于每条检测到的直线,在图像上绘制直线。我们使用直线的极坐标表示(rho和theta),将其转换为直线的两个端点坐标,并使用`cv2.line()`函数绘制直线。

最后,使用`cv2.imshow()`函数显示结果图像,并使用`cv2.waitKey()`和`cv2.destroyAllWindows()`等函数等待用户按键关闭窗口。

运行上述代码,你将看到显示了检测到的直线的图像窗口。直线以红色显示在原始图像上。

2、霍夫圆环变换

霍夫圆环变换(Hough Circle Transform)是一种用于在图像中检测圆的技术。它能够从图像中提取出圆的参数,例如圆心坐标和半径。

原理:

霍夫圆环变换的基本原理是在参数空间中累加圆的交点。对于每个图像中的边缘点,它们代表了可能的圆候选。通过对这些候选圆进行计数,可以找到在参数空间中累积计数最高的圆,从而得到图像中的圆。

示例:

下面是一个使用OpenCV实现霍夫圆环变换的简单示例代码:

复制代码
​
import cv2

import numpy as np

# 读取图像并转换为灰度图像

img = cv2.imread('image.jpg')

gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

# 进行图像平滑处理

gray = cv2.medianBlur(gray, 5)

# 检测圆环

circles = cv2.HoughCircles(gray, cv2.HOUGH_GRADIENT, dp=1, minDist=50,

param1=100, param2=30, minRadius=0, maxRadius=0)

# 绘制检测到的圆环

if circles is not None:

circles = np.uint16(np.around(circles))

for circle in circles[0, :]:

center = (circle[0], circle[1])

radius = circle[2]

cv2.circle(img, center, radius, (0, 255, 0), 2)

# 显示结果

cv2.imshow('Image', img)

cv2.waitKey(0)

cv2.destroyAllWindows()

​

在上述示例中,我们首先使用`cv2.imread()`函数读取图像,并将其转换为灰度图像。

然后,我们使用`cv2.medianBlur()`函数对灰度图像进行平滑处理,以减少噪声对霍夫圆环变换的影响。

接下来,使用`cv2.HoughCircles()`函数进行霍夫圆环变换。该函数接受七个参数:输入图像、霍夫圆环检测方法、dp值、最小间距、边缘阈值、圆心累加器阈值和最小/最大半径。在本例中,我们设置了霍夫圆环检测方法为`cv2.HOUGH_GRADIENT`,dp值为1,最小间距为50,边缘阈值为100,圆心累加器阈值为30,最小/最大半径为0(表示不限制半径的范围)。

然后,对于检测到的每个圆环,在图像上绘制圆。我们使用圆的圆心坐标和半径,使用`cv2.circle()`函数绘制圆。

最后,使用`cv2.imshow()`函数显示结果图像,并使用`cv2.waitKey()`和`cv2.destroyAllWindows()`等函数等待用户按键关闭窗口。

运行上述代码,你将看到显示了检测到的圆环的图像窗口。圆环以绿色显示在原始图像上。

相关推荐
我命由我123452 分钟前
Photoshop - Photoshop 工具栏(10)透视裁剪工具
经验分享·笔记·学习·ui·职场和发展·职场发展·photoshop
盼小辉丶3 分钟前
Transformer实战(21)——文本表示(Text Representation)
人工智能·深度学习·自然语言处理·transformer
艾醒(AiXing-w)7 分钟前
大模型面试题剖析:模型微调中冷启动与热启动的概念、阶段与实例解析
人工智能·深度学习·算法·语言模型·自然语言处理
科技小E11 分钟前
流媒体视频技术在明厨亮灶场景中的深度应用
人工智能
geneculture20 分钟前
融智学院十大学部知识架构示范样板
人工智能·数据挖掘·信息科学·哲学与科学统一性·信息融智学
无风听海21 分钟前
神经网络之交叉熵与 Softmax 的梯度计算
人工智能·深度学习·神经网络
算家计算22 分钟前
AI树洞现象:是社交降级,还是我们都在失去温度?
人工智能
JJJJ_iii26 分钟前
【深度学习03】神经网络基本骨架、卷积、池化、非线性激活、线性层、搭建网络
网络·人工智能·pytorch·笔记·python·深度学习·神经网络
sensen_kiss29 分钟前
INT301 Bio-computation 生物计算(神经网络)Pt.1 导论与Hebb学习规则
人工智能·神经网络·学习
玉石观沧海31 分钟前
高压变频器故障代码解析F67 F68
运维·经验分享·笔记·分布式·深度学习