`
huangyongxing310
  • 浏览: 499089 次
  • 性别: Icon_minigender_1
  • 来自: 广州
文章分类
社区版块
存档分类
最新评论

opencv 霍夫变换(识别出图像中的直线和圆)

 
阅读更多
# -*-encoding:utf-8-*-
import pytesseract
from PIL import Image
from PIL import ImageFilter
from PIL import ImageFont
from PIL import ImageDraw
import numpy as np
from PIL import Image

import cv2
import matplotlib.pyplot as plt

def main():
    # 使用霍夫变换识别出图像中的直线和圆
    # 分别使用霍夫线变换和圆变换检测图像中的直线和圆
    # OpenCV函数:cv2.HoughLines(), cv2.HoughLinesP(), cv2.HoughCircles()

    # =================================霍夫直线变换
    # 1.加载图片,转为二值图
    img = cv2.imread('test007.png')
    # img = cv2.imread('shapes.jpg')

    # drawing = np.zeros(img.shape[:], dtype=np.uint8)
    gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)


    edges = cv2.Canny(gray, 50, 150)
    # 2.霍夫直线变换
    lines = cv2.HoughLines(edges, 0.8, np.pi / 180, 90)

    # 参数1:要检测的二值图(一般是阈值分割或边缘检测后的图)
    # 参数2:距离r的精度,值越大,考虑越多的线
    # 参数3:角度θ的精度,值越小,考虑越多的线
    # 参数4:累加数阈值,值越小,考虑越多的线


    # 3.将检测的线画出来(注意是极坐标噢)
    drawing = np.zeros(img.shape[:], dtype=np.uint8)
    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(drawing, (x1, y1), (x2, y2), (0, 0, 255))

    # =================================统计概率霍夫直线变换
    # 前面的方法又称为标准霍夫变换,它会计算图像中的每一个点,计算量比较大,另外它得到的是整一条线(r和θ),并不知道原图中直线的端点。
    # 所以提出了统计概率霍夫直线变换(Probabilistic Transform),是一种改进的霍夫变换:
    # 3.统计概率霍夫线变换
    lines = cv2.HoughLinesP(edges, 0.8, np.pi /180, 50,
                            minLineLength=20, maxLineGap=10)

    # 前面几个参数跟之前的一样,有两个可选参数:
    # minLineLength:最短长度阈值,比这个长度短的线会被排除
    # maxLineGap:同一直线两点之间的最大距离
    #得到的结果是起始坐标点

    # 3.将检测的线画出来
    drawing2 = np.zeros(img.shape[:], dtype=np.uint8)
    for line in lines:
        x1, y1, x2, y2 = line[0]
        cv2.line(drawing2, (x1, y1), (x2, y2), (0, 255, 0), 1, lineType=cv2.LINE_AA)

    # cv2.LINE_AA在之前绘图功能中讲解过,表示抗锯齿线型。

    # =================================统计概率霍夫直线变换
    # 圆是用(x_center, y_center, r)来表示


    # 2.霍夫圆变换
    circles = cv2.HoughCircles(edges, cv2.HOUGH_GRADIENT, 1, 20, param2=75)
    circles = np.int0(np.around(circles)) #取约数
    print(circles) #[[[252 278  45]]]

    # 参数2:变换方法,一般使用霍夫梯度法,详情:HoughModes
    # 参数3:dp = 1:表示霍夫梯度法中累加器图像的分辨率与原图一致
    # 参数4:两个不同圆圆心的最短距离
    # 参数5:param2跟霍夫直线变换中的累加数阈值一样

    # 将检测的圆画出来
    drawing3 = np.zeros(img.shape[:], dtype=np.uint8)
    for i in circles[0, :]:
        cv2.circle(drawing3, (i[0], i[1]), i[2], (0, 255, 0), 2)  # 画出外圆
        cv2.circle(drawing3, (i[0], i[1]), 2, (0, 0, 255), 3)  # 画出圆心


    # cv2.imshow('equalization', equ)  # 并排显示
    cv2.imshow('gray', gray)  #
    cv2.imshow('edges', edges)  #
    cv2.imshow('drawing', drawing)  #
    cv2.imshow('drawing2', drawing2)  #
    cv2.imshow('drawing3', drawing3)  #
    cv2.waitKey(0)

if __name__ == '__main__':
    main()
分享到:
评论

相关推荐

    QT+opencv霍夫直线检测,圆检测及椭圆检测

    在这个项目中,"QT+opencv霍夫直线检测,圆检测及椭圆检测"涉及到使用OpenCV库中的霍夫变换(Hough Transform)算法来识别图像中的直线、圆形和椭圆形。 霍夫变换是图像处理中的一种特征检测技术,它能有效地检测出...

    【OpenCV入门教程之十四】OpenCV霍夫变换:霍夫线变换,霍夫圆变换合辑 - 【浅墨的游戏编程Blog】毛星云(浅墨)的专

    【OpenCV入门教程之十四】主要讲解了OpenCV中的霍夫变换,包括霍夫线变换和霍夫圆变换。霍夫变换是一种图像处理中的特征提取技术,由Paul Hough在1962年提出,主要用于从黑白图像中检测直线和曲线。它的基本思想是在...

    HT_transform_opencv_opencv霍夫_霍夫变换_图像处理_

    在OpenCV库中,霍夫变换被广泛应用于图像分析和模式识别任务,尤其在边缘检测后寻找几何形状方面表现出色。本教程将详细介绍如何使用OpenCV库实现霍夫线变换,以检测图像中的直线。 霍夫变换的基本原理是通过从像素...

    opencv霍夫变换检测直线.zip

    在这个"opencv霍夫变换检测直线.zip"压缩包中,可能包含了示例代码(opcvt.py)和相关的示例图片,用于演示如何在OpenCV中实现霍夫变换检测直线的过程。通过学习这个案例,你可以深入理解霍夫变换的工作原理,并将其...

    霍夫变换(圆的检测)

    霍夫变换是图像处理领域中的一种经典算法,主要用于检测图像中的几何形状,如直线、圆、椭圆等。在这个场景中,我们关注的是利用霍夫变换来检测圆形。OpenCV是一个强大的开源计算机视觉库,它提供了实现霍夫变换检测...

    霍夫变换检测直线

    霍夫变换的优点是可以检测出图像中的所有大于规定长度的直线段,并且可以检测出图像中的所有方向的直线。但是,霍夫变换也存在一些缺点,如计算复杂度高、detecting结果不稳定等。 霍夫变换是一种有效的图像处理...

    python+opencv实现霍夫变换检测直线

    在图像处理和计算机视觉领域,霍夫变换是一种被广泛使用的特征检测方法,尤其适用于检测图像中的直线、圆等规则形状。本篇将详细介绍如何利用Python结合OpenCV库实现霍夫变换来检测图像中的直线,并通过实例演示具体...

    基于opencv的圆形识别

    总之,基于OpenCV的圆形识别利用霍夫变换在图像中检测圆形,通过预处理、边缘检测和参数空间的分析,实现精确的圆形定位。这一技术广泛应用于各种场景,包括交通标志识别、制造业质量控制、医学图像分析等。理解和...

    基于opencv3.0的同心圆检测

    对于圆的检测,霍夫变换通过将像素坐标映射到三个参数空间(中心点的x坐标、y坐标和圆的半径r)进行投票,最终找到出现频率最高的参数组合,这些组合对应的点在参数空间中形成峰值,代表了图像中的圆形。 在OpenCV ...

    霍夫变换的直线检测

    霍夫变换是一种在图像处理领域广泛使用的算法,主要用于检测图像中的特定形状,如直线、圆、椭圆等。在这个特定的案例中,我们关注的是直线检测。霍夫变换的直线检测是通过将图像中的像素点转换到霍夫空间来实现的,...

    jiqishijue.zip_python图像处理_视觉;霍夫变换;圆_霍夫变换_霍夫变换圆_霍夫圆

    在给定的“jiqishijue.zip”压缩包中,包含了一个使用Python和OpenCV库进行图像处理的例子,特别是关于霍夫变换用于识别和绘制图像中的圆。这个例子非常适合初学者学习和参考。 首先,让我们了解一下霍夫变换的基本...

    OpenCV霍夫圆检测

    这个技术利用了霍夫变换(Hough Transform)的概念,它是一种参数空间的投票机制,能够有效地检测出图像中的一类形状,如直线、圆、椭圆等。在OpenCV库中,`HoughCircles`函数提供了实现霍夫圆检测的功能。 霍夫圆...

    霍夫直线和圆检测

    在OpenCV库中,霍夫变换被广泛应用于直线和圆的检测,从而帮助识别和提取图像中的几何特征。本篇文章将深入探讨霍夫直线检测和霍夫圆检测,并结合给定的`houghlines.cpp`和`houghcircles.cpp`源代码文件,解释其实现...

    霍夫变换源程序

    霍夫变换是计算机视觉领域中一种重要的几何形状检测方法,主要用来识别图像中的直线、圆、椭圆等形状。在本实例中,我们将探讨如何利用OpenCV库来实现图像的霍夫变换功能,以检测图像中的直线。 OpenCV(开源计算机...

    【OpenCv基础】第三十二讲 霍夫变换HoughCircles边缘检测与线性矢量.zip

    霍夫变换是一种图像处理技术,常用于检测图像中的直线、圆和其他几何形状。在这个教程中,我们将重点关注圆的检测,这对于多种计算机视觉应用至关重要,例如车辆检测、面部识别和工业自动化。 霍夫变换的基本原理是...

    详解利用python+opencv识别图片中的圆形(霍夫变换)

    霍夫变换是一种用于检测图像中特定形状(如直线、圆等)的有效方法。它的基本思想是在参数空间中寻找局部极大值,从而确定形状的位置和大小。对于圆形检测而言,使用的是霍夫圆变换。 #### 三、霍夫圆变换参数详解 ...

    形状识别识别圆及矩形

    在文件"**HoughTrans**"中,可能包含实现这些功能的代码示例或库函数,例如OpenCV库就提供了霍夫变换的相关接口,可以方便地用于检测图像中的圆形和矩形。通过学习和理解这些代码,你可以掌握如何在实际项目中运用...

    【OpenCv基础】第三十一讲 霍夫变换HoughLinesP边缘检测与线性矢量.zip

    本讲将聚焦于霍夫变换(Hough Transform),特别是HoughLinesP函数,它是OpenCV中用于检测直线的一种高效算法,特别适用于边缘检测和线性矢量分析。 霍夫变换是一种参数空间的投票方法,用于寻找图像中的几何形状,...

    Scratch_opencv_划痕识别_图像处理_

    为了增加长度和宽度识别的功能,可能还需要引入形状分析,例如利用霍夫变换检测直线,从而得到划痕的精确长度。 此外,如果划痕的颜色、亮度或者纹理与背景有显著区别,还可以使用色彩模型(如HSV、Lab)或纹理分析...

Global site tag (gtag.js) - Google Analytics