日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 人文社科 > 生活经验 >内容正文

生活经验

OpenCV中的霍夫线变换、概率霍夫线变换

發布時間:2023/11/27 生活经验 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 OpenCV中的霍夫线变换、概率霍夫线变换 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

OpenCV中的霍夫線變換、概率霍夫線變換

    • 1. 效果圖
    • 2. 原理
      • 2.1 什么是霍夫變換?
      • 2.2 什么是概率霍夫變換?
    • 3. 源碼
      • 3.1 霍夫變換
      • 3.2 概率霍夫變換
    • 參考

這篇博客將介紹Python,OpenCV中的霍夫變換。包括什么是霍夫變換(Hough Transform)、概率霍夫變換(Probablistic Hough Transform),以及如何使用cv2.HoughLines(),cv2.HoughLinesP()來檢測圖像中的線條。

1. 效果圖

原始圖 VS霍夫變換效果圖如下:

圖中檢測了所有線,包括角度為0°~180°(紅色線,經過原點下方的點)和 角度為-180°~0°的(綠色線,經過原點上方的點)。
原圖 VS 概率霍夫變換效果圖如下:
概率霍夫變換效果可以設置線之間的間隙大小,檢測出來小的短的線;

2. 原理

任意一條線可以用 y=mx+c 進行表示,也可用( ρ,θ)表示, ρ=xcosθ+ysinθ。ρ以像素為單位,θ以弧度為單位。

如果直線從原點下方經過,它的ρ為正,角度為(0,180);如果直線從原點上方經過,ρ為負,角度為(-180,0)。任何垂直線都是0度,水平線是90度。

2.1 什么是霍夫變換?

霍夫變換是一種流行的檢測任何形狀的技術,即使它是有些微損壞或輕微扭曲的,它也可以成功檢測。

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

  • edges:輸入圖像(二值圖像,因此在應用hough變換查找之前,先應用閾值或canny邊緣檢測)
  • 1: ρ精度,ρ以像素為單位,θ以弧度為單位。
  • np.pi/180:θ精度
  • 200:閾值,假設檢測線,表示被檢測到的線的最短長度,低于200像素長度的將被丟棄;
  • lines: 返回值(ρ,θ),ρ以像素為單位,θ以弧度為單位。

2.2 什么是概率霍夫變換?

概率霍夫變換(Probablistic Hough Transform)是霍夫變換(Hough Transform)的優化。

  • 霍夫變換拿線的所有點參與計算,而概率霍夫變換只考慮點的一個隨機子集,這對于線檢測是足夠的。

  • 霍夫變換返回值是( ρ,θ),而概率霍夫變換直接返回線的端點更便于操作;

lines = cv2.HoughLinesP(edges, 1, np.pi / 180, 100, minLineLength, maxLineGap)

  • edages、1、np.pi/180 跟霍夫變換一致,分別為輸入二值圖像、ρ精度、θ精度
  • minLineLength:最小線條長度。小于此長度的線將被丟棄;
  • maxLineGap:直線段之間允許的最大間距,將其視為單線。
  • lines:它直接返回線的倆個端點。

3. 源碼

3.1 霍夫變換

# 霍夫變換(可檢測任意形狀)# lines = cv2.HoughLines(edges, 1, np.pi / 180, 200)
# - edges:輸入圖像(二值圖像,因此在應用hough變換查找之前,先應用閾值或canny邊緣檢測)
# - 1: ρ精度,ρ以像素為單位,θ以弧度為單位。
# - np.pi/100: 角度,θ精度
# - 200:閾值,假設檢測線,表示被檢測到的線的最短長度
# - lines: 返回值(ρ,θ),ρ以像素為單位,θ以弧度為單位。
#
# 概率霍夫變換(Probablistic Hough Transform)是霍夫變換(Hough Transform)的優化。
# 霍夫變換拿線的所有點參與計算,而概率霍夫變換不考慮所有的點,而是只考慮點的一個隨機子集,這對于線檢測是足夠的。
# lines = cv2.HoughLinesP(edges, 1, np.pi / 180, 100, minLineLength, maxLineGap)
# - edages、1、np.pi/180 跟霍夫變換一致,分別為輸入二值圖像、ρ精度、θ精度
# - minLineLength:最小線條長度。小于此長度的線段將被丟棄;
# - maxLineGap:直線段之間允許的最大間距,將其視為單線。
# - lines:它直接返回兩條線的端點。import cv2
import imutils
import numpy as npimg = cv2.imread('hf1.jpg')
cv2.imshow("origin", imutils.resize(img, width=400))
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
edges = cv2.Canny(gray, 50, 150, apertureSize=3)print(np.pi / 180, np.pi / 360)
lines = cv2.HoughLines(edges, 1, np.pi / 180, 200)for i, line in enumerate(lines):for rho, theta in line:# print(rho, theta * 180 - 180)a = np.cos(theta)b = np.sin(theta)x0 = a * rhoy0 = b * rhox1 = int(x0 + 1000 * (-b))y1 = int(y0 + 1000 * (a))x2 = int(x0 - 1000 * (-b))y2 = int(y0 - 1000 * (a))# 弧度轉角度degree = theta * 180 - 180if (degree > 180):degree = degree - 360print(rho, degree)if rho > 0 and degree > 0:  # 經過原點下方的點,角度為正(0,180)cv2.line(img, (x1, y1), (x2, y2), (0, 0, 255), 2)else:  # 經過原點上方的點,角度為負(-180,0)cv2.line(img, (x1, y1), (x2, y2), (0, 255, 0), 2)cv2.imwrite('houghlines_hf.jpg', img)
cv2.imshow("hf_res", imutils.resize(img, width=400))
cv2.waitKey(0)

3.2 概率霍夫變換

# 概率霍夫變換# 霍夫變換(可檢測任意形狀)
# lines = cv2.HoughLines(edges, 1, np.pi / 180, 200)
# - edges:輸入圖像(二值圖像,因此在應用hough變換查找之前,先應用閾值或canny邊緣檢測)
# - 1: ρ精度
# - np.pi/100:θ精度
# - 200:閾值,假設檢測線,表示被檢測到的線的最短長度
# - lines: 返回值(ρ,θ),ρ以像素為單位,θ以弧度為單位。# 概率霍夫變換(Probablistic Hough Transform)是霍夫變換(Hough Transform)的優化。
# 霍夫變換拿線的所有點參與計算,而概率霍夫變換不考慮所有的點,而是只考慮點的一個隨機子集,這對于線檢測是足夠的。
# lines = cv2.HoughLinesP(edges, 1, np.pi / 180, 100, minLineLength, maxLineGap)
# - edages、1、np.pi/180 跟霍夫變換一致,分別為輸入二值圖像、ρ精度、θ精度
# - minLineLength:最小線條長度。小于此長度的線段將被丟棄;
# - maxLineGap:直線段之間允許的最大間距,將其視為單線。
# - lines:它直接返回兩條線的端點。# 概率霍夫變換(Probablistic Hough Transform)是霍夫變換(Hough Transform)的優化。
# 霍夫變換拿線的所有點參與計算,而概率霍夫變換不考慮所有的點,而是只考慮點的一個隨機子集,這對于線檢測是足夠的。import cv2
import imutils
import numpy as npimg = cv2.imread('hf1.jpg')
cv2.imshow("origin", imutils.resize(img, width=400))
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
edges = cv2.Canny(gray, 50, 150, apertureSize=3)minLineLength = 100
maxLineGap = 10
lines = cv2.HoughLinesP(edges, 1, np.pi / 180, 10, minLineLength, maxLineGap)# 只繪制第一條線
# for x1, y1, x2, y2 in lines[0]:
#     cv2.line(img, (x1, y1), (x2, y2), (0, 255, 0), 2)print(len(lines))
# 繪制所有檢測結果
for i, line in enumerate(lines):for x1, y1, x2, y2 in line:cv2.line(img, (x1, y1), (x2, y2), (0, 255, 0), 2)
cv2.imwrite('houghlines_hfp.jpg', img)
cv2.imshow("hfp_res", imutils.resize(img, width=400))
cv2.waitKey(0)

參考

  • https://docs.opencv.org/3.0-beta/doc/py_tutorials/py_imgproc/py_houghlines/py_houghlines.html#py-hough-lines

總結

以上是生活随笔為你收集整理的OpenCV中的霍夫线变换、概率霍夫线变换的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。