霍夫变换直线检测原理和应用

这篇具有很好参考价值的文章主要介绍了霍夫变换直线检测原理和应用。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1. 引言

今天我们将重点讨论霍夫变换,这是一种非常经典的线检测的算法,通过将图像中的点映射到参数空间中的线来实现。霍夫变换可以检测任何方向的线,并且可以在具有大量噪声的图像中很好地工作。
闲话少说,我们直接开始吧!

2. 基础知识

为了理解霍夫变换的工作原理,首先我们需要了解直线是如何在极坐标系中定义的。直线由ρ(距原点的垂直距离)和θ(垂直线与轴线的夹角)来描述,如下图所:
霍夫变换检测直线的应用,图像处理,Python,计算机视觉,opencv,人工智能
因此,该直线的方程式为:
霍夫变换检测直线的应用,图像处理,Python,计算机视觉,opencv,人工智能
我们可以将其转化下表述形式,得到如下公式:
霍夫变换检测直线的应用,图像处理,Python,计算机视觉,opencv,人工智能
从上面的方程中,我们可以看出,所有具有相同ρ和θ值的点构成一条直线。我们算法的基础是针对θ的所有可能值计算图像中每个点的ρ值。

3. 算法原理

霍夫变换的处理步骤如下:
1)首先我们创建一个参数空间(又叫做霍夫空间)。参数空间是ρ和θ的二维矩阵,其中θ的范围在0–180之间。
2)使用诸如Canny边缘之类的边缘检测算法检测图像的边缘之后运行该算法。值为255的像素被认为是边缘。
3)接着我们逐像素扫描图像以找到这些边缘像素,并通过使用从0到180的θ值来计算每个像素的ρ。对于同一直线上的像素,θ和rho的值将是相同的。我们在霍夫空间中以1的权重对其投票。
4)最后,投票超过一定阈值的ρ和θ的值被视为直线。

代码处理过程如下:

def hough(img):
    # Create a parameter space
    # Here we use a dictionary
    H=dict()
    # We check for pixels in image which have value more than 0(not black)
    co=np.where(img>0)
    co=np.array(co).T
    for point in co:
        for t in range(180):
            # Compute rho for theta 0-180
            d=point[0]*np.sin(np.deg2rad(t))+point[1]*np.cos(np.deg2rad(t))
            d=int(d)
            # Compare with the extreme cases for image
            if d<int(np.ceil(np.sqrt(np.square(img.shape[0]) + np.square(img.shape[1])))):
                if (d,t) in H:
                    # Upvote
                    H[(d,t)] += 1
                else:
					# Create a new vote
                    H[(d,t)] = 1
    return H

4. 算法应用

在本文中,我们将检测图像中对象(书籍)的角点。这似乎是一项简单的任务,然而,它将让我们深入了解使用霍夫变换检测直线的过程。

4.1 彩色图到HSV空间

由于直接RGB图像做这项任务略有难度,我们不妨将该图像转换为HSV颜色空间,以便在HSV范围内轻松获取我们的目标。
核心代码如下:

img = cv2.imread("book.jpeg")
scale_percent = 30 # percent of original size
width = int(img.shape[1] * scale_percent / 100)
height = int(img.shape[0] * scale_percent / 100)
dim = (width, height)
# resize image
img = cv2.resize(img, dim, interpolation = cv2.INTER_AREA)
hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)

得到结果如下所示:
霍夫变换检测直线的应用,图像处理,Python,计算机视觉,opencv,人工智能

4.2 高斯模糊

我们应用高斯模糊来平滑图像中由于噪声而产生的粗糙边缘,进而可以突出我们图像中的目标,代码如下:

# Apply gaussian blur to he mask
blur = cv2.GaussianBlur(hsv, (9, 9), 3)

结果如下所示:
霍夫变换检测直线的应用,图像处理,Python,计算机视觉,opencv,人工智能

4.3 二值化和腐蚀操作

接着我们使用inRange函数来得到二值化图像。这使我们能够摆脱图像中其他周围的物体。代码如下:

# Define the color range for the ball (in HSV format)
lower_color = np.array([0, 0, 24],np.uint8)
upper_color = np.array([179, 255, 73],np.uint8)
# Define the kernel size for the morphological operations
kernel_size = 7
# Create a mask for the ball color using cv2.inRange()
mask = cv2.inRange(blur, lower_color, upper_color)

得到结果如下:
霍夫变换检测直线的应用,图像处理,Python,计算机视觉,opencv,人工智能
我们观察上图,存在或多或少的缝隙,我们不妨使用腐蚀操作来填补这些缝隙。代码如下:

# Apply morphological operations to the mask to fill in gaps
kernel = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (kernel_size, kernel_size))
mask = cv2.dilate(mask, kernel,iterations=1)

结果如下:
霍夫变换检测直线的应用,图像处理,Python,计算机视觉,opencv,人工智能

4.4 边缘检测

边缘检测canny主要用于检测边缘。这主要是因为目标和周围背景之间的高对比度。代码如下:

#  Use canny edges to get the edges of the image mask
edges = cv2.Canny(mask,200, 240, apertureSize=3)

结果如下图所示:
霍夫变换检测直线的应用,图像处理,Python,计算机视觉,opencv,人工智能

4.5 霍夫变换

当我们进行canny边缘检测时,我们得到了很多边缘。因此,当我们运行霍夫算法时,这些边为同一条边贡献了许多条候选线。为了解决这个问题,我们对霍夫空间中ρ和θ的相邻值进行聚类,并对它们的值进行平均,得到它们的上投票数之和。这导致了描绘相同边缘的线条的合并,代码如下:

# Get the hough space, sort and select to 20 values
hough_space = dict(sorted(hough(edges).items(), key=lambda item: item[1],reverse=True)[:20])
# Sort the hough space w.r.t rho and theta
sorted_hough_space_unfiltered = dict(sorted(hough_space.items()))
# Get the unique rhoand theta values
unique_=unique(sorted_hough_space_unfiltered)
# Sort according to value and get the top 4 lines
unique_=dict(sorted(unique_.items(), key=lambda item: item[1],reverse=True)[:4])

得到结果如下:
霍夫变换检测直线的应用,图像处理,Python,计算机视觉,opencv,人工智能

4.6 计算角点

根据在霍夫空间中获得的直线,我们可以使用线性代数对其进行角点求解。这可以求出我们两条直线的交叉点,也就是书的角点,代码如下:

# Create combinations of lines
line_combinations = list(combinations(unique_.items(), 2))

intersection=[]
filter_int=[]
for (key1, value1), (key2, value2) in line_combinations:
    try:
	# Solve point of intersection of two lines
        intersection.append(intersection_point(key1[0],np.deg2rad(key1[1]), key2[0],np.deg2rad(key2[1]))) 
    except:
        print("Singular Matrix")

for x,y in intersection:
    if x>0 and y>0:
		# Get the valid cartesan co ordinates
        cv2.circle(img, (x, y), 5, (0, 0, 0), -1)
        cv2.putText(img, '{},{}'.format(x,y), (x-10, y), cv2.FONT_HERSHEY_SIMPLEX, 0.4, (255, 255, 255), 1)
        filter_int.append([x,y])

最终输出如下图所示:
霍夫变换检测直线的应用,图像处理,Python,计算机视觉,opencv,人工智能

5. 总结

尽管该算法现已集成在各种各样的图像处理库,但本文通过自己实现它,我们可以深入了解在创建如此复杂的算法时所面临的挑战和局限性。

嗯嗯,您学废了嘛?

代码链接:戳我文章来源地址https://www.toymoban.com/news/detail-740211.html

到了这里,关于霍夫变换直线检测原理和应用的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • OpenCV-Python中的图像处理-霍夫变换

    霍夫(Hough)变换在检测各种形状的技术中非常流行,如果要检测的形状可以用数学表达式描述,就可以是使用霍夫变换检测它。即使要检测的形状存在一点破坏或者扭曲也是可以使用。 Hough直线变换,可以检测一张图像中的直线 cv2.HoughLines(image, rho, theta, threshold) return:返回值

    2024年02月12日
    浏览(46)
  • Python-OpenCV中的图像处理-霍夫变换

    霍夫(Hough)变换在检测各种形状的技术中非常流行,如果要检测的形状可以用数学表达式描述,就可以是使用霍夫变换检测它。即使要检测的形状存在一点破坏或者扭曲也是可以使用。 Hough直线变换,可以检测一张图像中的直线 cv2.HoughLines(image, rho, theta, threshold) return:返回值

    2024年02月13日
    浏览(64)
  • OpenCV中的图像处理 —— 霍夫线 / 圈变换 + 图像分割(分水岭算法) + 交互式前景提取(GrabCut算法)

    🌎上一节我们介绍了OpenCV中傅里叶变换和模板匹配,这一部分我们来聊一聊霍夫线/圈变换的原理和应用、使用分水岭算法实现图像分割和使用GrabCut算法实现交互式前景提取 🏠哈喽大家好,这里是ErrorError!,一枚某高校大二本科在读的♂同学,希望未来在机器视觉领域能够有

    2023年04月08日
    浏览(49)
  • 霍夫变换车道线识别-车牌字符识别代码(matlab仿真与图像处理系列第5期)

    当使用霍夫变换进行车道线识别时,可以按照以下步骤来编写 MATLAB 代码: 读入图像:使用 imread 函数读取包含车道线的图像。 图像预处理:为了减少噪音和突出车道线,可以对图像进行预处理。通常,可以采用以下步骤: 将图像转换为灰度图像:使用 rgb2gray 函数将彩色图

    2024年02月11日
    浏览(45)
  • 【OpenCV-Python】——边缘和轮廓&Laplacian/Sobel/Canny边缘检测&查找/绘制轮廓及轮廓特征&霍夫直线/圆变换

    目录 前言: 1、边缘检测 1.1 Laplacian边缘检测  1.2 Sobel边缘检测  1.3 Canny边缘检测 2、图像轮廓 2.1 查找轮廓  2.2 绘制轮廓 2.3 轮廓特征 3、霍夫变换 3.1 霍夫直线变换  3.2 霍夫圆变换 总结: 图像的边缘是指图像中灰度值急剧变化的位置,边缘检测的目的是为了绘制边缘线条。

    2024年01月23日
    浏览(48)
  • OpenCV26HoughCircles 霍夫圆变换原理及圆检测

    霍夫圆变换的基本原理与霍夫线变换大体类似 对直线来说,一条直线能由极径极角(r,θ)表示,而对于圆来说,我们需要三个参数:圆心(a,b),半径 r 笛卡尔坐标系中圆的方程为: (x-a)2 + (y-b)2 = r2 化简便可得到: a = x - r·cosθ b = y - r·sinθ 对于(x0,y0),我们可以将通

    2024年02月03日
    浏览(43)
  • Hough变换原理-直线检测

    目录   一、简介 二、原理 三、Python代码实现           Hough(霍夫)变换是图像处理中从图像中识别几何形状的基本方法之一。 Hough变换是将图像坐标空间变换到参数空间 ,利用点与线的对偶性,将原始图像空间的给定的曲线(今天主要介绍直线)通过曲线表达形式变

    2024年02月04日
    浏览(38)
  • 13- OpenCV:霍夫检测:直线、圆检测

    目录 一、霍夫变换简介 1、霍夫变换的原理 2、霍夫变换的优点 3、霍夫变换的缺点 4、霍夫变换的应用场景 5、使用霍夫变换的步骤 二、霍夫变换—直线检测 1、霍夫直线变换介绍 2、霍夫直线变换的例子 3、相关API学习(代码例子) 三、霍夫变换—圆检测 1、霍夫圆检测原理

    2024年02月21日
    浏览(52)
  • 【OpenCV】cv2.HoughLines()霍夫直线检测

    霍夫直线检测(Hough Line Transform)是一种在图像中检测直线的经典算法。它通过将二维图像空间中的点映射到极坐标空间中,将直线检测问题转化为在参数空间中找到交点的问题。 原理: 对于图像空间中的每个边缘点,计算其对应在极坐标空间中可能的直线。 极坐标空间中

    2024年02月05日
    浏览(60)
  • 【课程介绍】OpenCV 基础入门教程:图像读取、显示、保存,图像处理和增强(如滤波、边缘检测、图像变换),特征提取和匹配,目标检测和跟踪

    [ 专栏推荐 ] 😃 《视觉探索: OpenCV 基础入门教程》 😄 ❤️【简介】: Opencv 入门课程适合初学者,旨在介绍 Opencv 库的基础知识和核心功能。课程包括图像读取、显示、保存,图像处理和增强(如滤波、边缘检测、图像变换),特征提取和匹配,目标检测和跟踪等内容。学

    2024年02月16日
    浏览(398)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包