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

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

霍夫变换

  • 霍夫(Hough)变换在检测各种形状的技术中非常流行,如果要检测的形状可以用数学表达式描述,就可以是使用霍夫变换检测它。即使要检测的形状存在一点破坏或者扭曲也是可以使用。

霍夫直线变换

  1. Hough直线变换,可以检测一张图像中的直线
  2. cv2.HoughLines(image, rho, theta, threshold)
    • return:返回值就是( ρ, θ)。 ρ 的单位是像素, θ 的单位是弧度。
    • image:是一个二值化图像,所以在进行霍夫变换之前要首先进行二值化,或者进行Canny 边缘检测。
    • rho:代表 ρ 的精确度。
    • theta:代表θ 的精确度。
    • threshold:阈值,只有累加其中的值高于阈值时才被认为是一条直线,也可以把它看成能检测到的直线的最短长度(以像素点为单位)。
  3. cv2.HoughLinesP(image: Mat, rho, theta, threshold, lines=…, minLineLength=…, maxLineGap=…)
    • return :返回值就是直线的起点和终点(x1,y1,x2,y2)。
    • rho:代表 ρ 的精确度。
    • theta:代表θ 的精确度。
    • threshold:阈值,只有累加其中的值高于阈值时才被认为是一条直线,也可以把它看成能检测到的直线的最短长度(以像素点为单位)。
    • minLineLength:直线的最短长度。比这个短的线都会被忽略。
    • maxLineGap- 两条线段之间的最大间隔,如果小于此值,这两条直线就被看成是一条直线。
  4. 一条直线可以用数学表达式 y = mx + c 或者 ρ = x cos θ + y sin θ 表示。ρ 是从原点到直线的垂直距离, θ 是直线的垂线与横轴顺时针方向的夹角(如果使用的坐标系不同,方向也可能不同,这里是按 OpenCV 使用的坐标系描述的)。如下图所示:
    Python-OpenCV中的图像处理-霍夫变换,OpenCV Python,python,opencv,图像处理
import numpy as np
import cv2
from matplotlib import pyplot as plt

img = cv2.imread('./resource/opencv/image/sudoku.png', cv2.IMREAD_COLOR)
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
edges = cv2.Canny(gray, 50, 150, apertureSize=3)

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

for i in range(len(lines)):
# for rho, thetha in lines[10]:
    rho = lines[i][0][0]
    thetha = lines[i][0][1]
    a = np.cos(thetha)
    b = np.sin(thetha)
    x0 = a*rho
    y0 = b*rho
    line_length = 1000 # 线长
    x1 = int(x0 + line_length*(-b))
    y1 = int(y0 + line_length*(a))
    x2 = int(x0 - line_length*(-b))
    y2 = int(y0 - line_length*(a))
    cv2.line(img, (x1, y1), (x2, y2), (0, 255, 0), 1)

# 因为gray和edges都是单通道的,为了可以和原图拼接合并,需要merge成3通道图像数据
gray = cv2.merge((gray, gray, gray))
edges = cv2.merge((edges,edges,edges))

# 图像拼接
res = np.hstack((gray,edges,img))

cv2.imshow('res', res)
cv2.waitKey(0)
cv2.destroyAllWindows()

Python-OpenCV中的图像处理-霍夫变换,OpenCV Python,python,opencv,图像处理
渐进概率式霍夫变换
cv2.HoughLinesP(image: Mat, rho, theta, threshold, lines=…, minLineLength=…, maxLineGap=…)

import numpy as np
import cv2
from matplotlib import pyplot as plt

img = cv2.imread('./resource/opencv/image/sudoku.png', cv2.IMREAD_COLOR)
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
canny = cv2.Canny(gray, 50, 150, apertureSize=3)

minLineLength = 100
maxLineGap = 10
# HoughLinesP(image: Mat, rho, theta, threshold, lines=..., minLineLength=..., maxLineGap=...) 
lines = cv2.HoughLinesP(canny, 1, np.pi/180, 100, minLineLength, maxLineGap)

print(lines.shape)
print(lines[0])

for i in range(len(lines)):
    for x1,y1,x2,y2 in lines[i]:
        cv2.line(img, (x1, y1), (x2, y2), (0, 255, 0), 1)

gray = cv2.merge((gray, gray, gray))
canny = cv2.merge((canny,canny,canny))

res = np.hstack((gray, canny, img))
cv2.imshow('res', res)
cv2.waitKey(0)
cv2.destroyAllWindows()

Python-OpenCV中的图像处理-霍夫变换,OpenCV Python,python,opencv,图像处理
在含有坐标点集合中寻找是否存在直线:
cv2.HoughLinesPointSet(_point, lines_max, threshold, min_rho, max_rho, rho_step, min_theta, max_theta, theta_step, _lines=…)

  • _point:输入点的集合,必须是平面内的2D坐标,数据类型必须是CV_32FC2或CV_32SC2。
  • lines_max:检测直线的最大数目。
  • threshold:累加器的阈值,即参数空间中离散化后每个方格被通过的累计次数大于阈值时则被识别为直线,否则不被识别为直线。
  • min_rho:检测直线长度的最小距离,以像素为单位。
  • max_rho:检测直线长度的最大距离,以像素为单位。
  • rho_step::以像素为单位的距离分辨率,即距离 离散化时的单位长度。
  • min_theta:检测直线的最小角度值,以弧度为单位。
  • max_theta:检测直线的最大角度值,以弧度为单位。
  • theta_step:以弧度为单位的角度分辨率,即夹角 离散化时的单位角度。
  • _lines:在输入点集合中可能存在的直线,每一条直线都具有三个参数,分别是权重、直线距离坐标原点的距离 和坐标原点到直线的垂线与x轴的夹角 。

霍夫圆环变换

  1. 圆形的数学表达式为 (x − xcenter)2+(y − ycenter)2 = r2,其中( xcenter,ycenter)为圆心的坐标, r 为圆的直径。从这个等式中我们可以看出:一个圆环需要 3个参数来确定。所以进行圆环霍夫变换的累加器必须是 3 维的,这样的话效率就会很低。所以 OpenCV 用来一个比较巧妙的办法,霍夫梯度法,它可以使用边界的梯度信息。
  2. cv2.HoughCircles(image, method, dp, minDist, circles=…, param1=…, param2=…, minRadius=…, maxRadius=…)
    • return:存储检测到的圆的输出矢量。
    • image:输入图像,数据类型一般用Mat型即可,需要是8位单通道灰度图像
    • method:使用的检测方法,cv2.HOUGH_GRADIENT,cv2.HOUGH_GRADIENT_ALT。
    • dp:double类型的dp,用来检测圆心的累加器图像的分辨率于输入图像之比的倒数,且此参数允许创建一个比输入图像分辨率低的累加器。上述文字不好理解的话,来看例子吧。例如,如果dp= 1时,累加器和输入图像具有相同的分辨率。如果dp=2,累加器便有输入图像一半那么大的宽度和高度。
    • minDist:为霍夫变换检测到的圆的圆心之间的最小距离。
    • circles:可以忽略,存储检测到的圆的输出矢量。
    • param1:它是第三个参数method设置的检测方法的对应的参数。它表示传递给canny边缘检测算子的高阈值,而低阈值为高阈值的一半。
    • param2:也是第三个参数method设置的检测方法的对应的参数,它表示在检测阶段圆心的累加器阈值。它越小的话,就可以检测到更多根本不存在的圆,而它越大的话,能通过检测的圆就更加接近完美的圆形了。
    • minRadius:表示圆半径的最小值。
    • maxRadius:表示圆半径的最大值。
import numpy as np
import cv2

img = cv2.imread('./resource/opencv/image/logo/opencv-logo2.png', cv2.IMREAD_GRAYSCALE)
img = cv2.medianBlur(img, 5)
cimg = cv2.cvtColor(img, cv2.COLOR_GRAY2BGR)

circles = cv2.HoughCircles(img, cv2.HOUGH_GRADIENT, 1, 20, param1=50, param2=30, minRadius=30, maxRadius=0)

print(circles)
circles = np.uint16(circles)
print(circles)

for i in circles[0, :]:
    cv2.circle(cimg, (i[0], i[1]), i[2], (0, 255, 0), 2)
    cv2.circle(cimg, (i[0], i[1]), 2, (0, 0, 255), 3)

cv2.imshow('detected circles', cimg)
cv2.waitKey(0)
cv2.destroyAllWindows()

Python-OpenCV中的图像处理-霍夫变换,OpenCV Python,python,opencv,图像处理文章来源地址https://www.toymoban.com/news/detail-644326.html

到了这里,关于Python-OpenCV中的图像处理-霍夫变换的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • Python-OpenCV中的图像处理-图像阀值

    与名字一样,这种方法非常简单。但像素值高于阈值时,我们给这个像素赋予一个新值(可能是白色),否则我们给它赋予另外一种颜色(也许是黑色)。这个函数就是 cv2.threshhold()。这个函数的第一个参数就是原图像,原图像应该是灰度图。第二个参数就是用来对像素值进

    2024年02月13日
    浏览(29)
  • Python-OpenCV中的图像处理-图像直方图

    通过直方图你可以对整幅图像的灰度分布有一个整体的了解。直方图的 x 轴是灰度值( 0 到 255), y 轴是图片中具有同一个灰度的点的数目。 BINS:上面的直方图显示了每个灰度值对应的像素数。如果像素值为 0到255,你就需要 256 个数来显示上面的直方图。但是,如果你不需

    2024年02月12日
    浏览(41)
  • Python-OpenCV中的图像处理-图像金字塔

    同一图像的不同分辨率的子图集合,如果把最大的图像放在底部,最小的放在顶部,看起来像一座金字塔,故而得名图像金字塔。 cv2.pyrUp():上采样 cv2.pyrDown():下采样 高斯金字塔的顶部是通过将底部图像中的连续的行和列去除得到的。顶部图像中的每个像素值等于下一层图

    2024年02月13日
    浏览(40)
  • Python-OpenCV中的图像处理-几何变换

    对图像进行各种几个变换,例如移动,旋转,仿射变换等。 cv2.resize() cv2.INTER_AREA v2.INTER_CUBIC v2.INTER_LINEAR res = cv2.resize(img, None, fx=2, fy=2, interpolation=cv2.INTER_CUBIC) 或 height, width = img.shape[:2] res = cv2.resize(img, (2 width, 2 height), interpolation=cv2.INTER_CUBIC) OpenCV提供了使用函数cv2.warpAffine()实

    2024年02月13日
    浏览(49)
  • Python-OpenCV中的图像处理-边缘检测

    Canny 边缘检测是一种非常流行的边缘检测算法,是 John F.Canny 在 1986 年提出的。它是一个有很多步构成的算法:噪声去除、计算图像梯度、非极大值抑制、滞后阀值等。 Canny(image: Mat, threshold1, threshold2, edges=…, apertureSize=…, L2gradient=…) 在 OpenCV 中只需要一个函数: cv2.Canny(),

    2024年02月13日
    浏览(31)
  • Python-OpenCV中的图像处理-物体跟踪

    现在我们知道怎样将一幅图像从 BGR 转换到 HSV 了,我们可以利用这一点来提取带有某个特定颜色的物体。在 HSV 颜色空间中要比在 BGR 空间中更容易表示一个特定颜色。在我们的程序中,我们要提取的是一个蓝色的物体。下面就是就是我们要做的几步: • 从视频中获取每一帧

    2024年02月13日
    浏览(36)
  • Python-OpenCV中的图像处理-颜色空间转换

    在 OpenCV 中有超过 150 中进行颜色空间转换的方法。但是你以后就会 发现我们经常用到的也就两种: BGR G r a y 和 B G R Gray 和 BGR G r a y 和 BGR HSV。 注意:在 OpenCV 的 HSV 格式中, H(色彩/色度)的取值范围是 [0, 179],S(饱和度)的取值范围 [0, 255], V(亮度)的取值范围 [0,

    2024年02月13日
    浏览(22)
  • Python-OpenCV中的图像处理-直方图

    通过直方图你可以对整幅图像的灰度分布有一个整体的了解。直方图的 x 轴是灰度值( 0 到 255), y 轴是图片中具有同一个灰度的点的数目。 BINS:上面的直方图显示了每个灰度值对应的像素数。如果像素值为 0到255,你就需要 256 个数来显示上面的直方图。但是,如果你不需

    2024年02月13日
    浏览(33)
  • Python-OpenCV中的图像处理-形态学转换

    形态学操作:腐蚀,膨胀,开运算,闭运算,形态学梯度,礼帽,黑帽等 主要涉及函数:cv2.erode(), cv2.dilate(), cv2.morphologyEx() 原理:形态学操作是根据图像形状进行的简单操作。一般情况下对二值化图像进行的操作。需要输入两个参数,一个是原始图像,第二个被称为结构化

    2024年02月13日
    浏览(38)
  • Python-OpenCV中的图像处理-傅里叶变换

    傅里叶变换经常被用来分析不同滤波器的频率特性。我们可以使用 2D 离散傅里叶变换 (DFT) 分析图像的频域特性。实现 DFT 的一个快速算法被称为快速傅里叶变换( FFT)。 对于一个正弦信号:x (t) = A sin (2πft), 它的频率为 f,如果把这个信号转到它的频域表示,我们会在频率

    2024年02月12日
    浏览(43)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包