OpenCV半小時掌握基本操作之直線檢測
【OpenCV】 ⚠️高手勿入! 半小時學(xué)會基本操作 ⚠️ 直線檢測
概述
OpenCV 是一個跨平臺的計算機視覺庫, 支持多語言, 功能強大. 今天小白就帶大家一起攜手走進 OpenCV 的世界. (第 13 課)

霍夫直線變換
霍夫變換 (Hough Line Transform) 是圖像處理中的一種特征提取技術(shù). 通過平面空間到極值坐標(biāo)空間的轉(zhuǎn)換, 可以幫助我們實現(xiàn)直線檢測. 如圖:

原理詳解
當(dāng)我們把直線 y = kx + b 畫在指標(biāo)坐標(biāo)系上, 如下圖. 我們再從原點引線段到直線上的任一點.

我們可以得到這條線段與 x 軸的夾角為 θ, 距離是 r. 對于直線上的任一點 (x0, y0), 我們可以得到公式:

代碼實戰(zhàn)
HoughLines
格式:
cv2.HoughLines(image, rho, theta, threshold, lines=None, srn=None, stn=None, min_theta=None, max_theta=None)
參數(shù):
- image: 輸入圖像
- rho: 線性搜索半徑步長, 以像素為單位
- theta: 線性搜索步長, 以弧度為單位
- threshold: 累計閾值
例子:
import numpy as np
import cv2
from matplotlib import pyplot as plt
# 讀取圖片
image = cv2.imread("sudoku.jpg")
image_copy = image.copy()
# 轉(zhuǎn)換成灰度圖
image_gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
# 邊緣檢測, Sobel算子大小為3
edges = cv2.Canny(image_gray, 170, 220, apertureSize=3)
# 霍夫曼直線檢測
lines = cv2.HoughLines(edges, 1, np.pi / 180, 250)
# 遍歷
for line in lines:
# 獲取rho和theta
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(image_copy, (x1, y1), (x2, y2), (0, 0, 255), thickness=5)
# 圖片展示
f, ax = plt.subplots(2, 2, figsize=(12, 12))
# 子圖
ax[0, 0].imshow(cv2.cvtColor(image, cv2.COLOR_BGR2RGB))
ax[0, 1].imshow(image_gray, "gray")
ax[1, 0].imshow(edges, "gray")
ax[1, 1].imshow(cv2.cvtColor(image_copy, cv2.COLOR_BGR2RGB))
# 標(biāo)題
ax[0, 0].set_title("original")
ax[0, 1].set_title("image gray")
ax[1, 0].set_title("image edge")
ax[1, 1].set_title("image line")
plt.show()
輸出結(jié)果:


HoughLinesP
此函數(shù)在 HoughLines 的基礎(chǔ)上末尾加了一個代表概率 (Probabilistic) 的 P, 表明它可以采用累計概率霍夫變換, 來找出二值圖像中的直線.
格式:
HoughLinesP(image, rho, theta, threshold, lines=None, minLineLength=None, maxLineGap=None)
參數(shù):
- image: 輸入圖像
- rho: 線性搜索半徑步長, 以像素為單位
- theta: 線性搜索步長, 以弧度為單位
- threshold: 累計閾值
- minLineLength: 最短直線長度
- maxLineGap: 最大孔隙距離
例子:
import numpy as np
import cv2
from matplotlib import pyplot as plt
# 讀取圖片
image = cv2.imread("sudoku.jpg")
image_copy = image.copy()
# 轉(zhuǎn)換成灰度圖
image_gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
# 邊緣檢測, Sobel算子大小為3
edges = cv2.Canny(image_gray, 170, 220, apertureSize=3)
# 霍夫曼直線檢測
lines = cv2.HoughLinesP(edges, 1, np.pi / 180, 100, minLineLength=100, maxLineGap=10)
# 遍歷
for line in lines:
# 獲取坐標(biāo)
x1, y1, x2, y2 = line[0]
cv2.line(image_copy, (x1, y1), (x2, y2), (0, 0, 255), thickness=5)
# 圖片展示
f, ax = plt.subplots(2, 2, figsize=(12, 12))
# 子圖
ax[0, 0].imshow(cv2.cvtColor(image, cv2.COLOR_BGR2RGB))
ax[0, 1].imshow(image_gray, "gray")
ax[1, 0].imshow(edges, "gray")
ax[1, 1].imshow(cv2.cvtColor(image_copy, cv2.COLOR_BGR2RGB))
# 標(biāo)題
ax[0, 0].set_title("original")
ax[0, 1].set_title("image gray")
ax[1, 0].set_title("image edge")
ax[1, 1].set_title("image line")
plt.show()
輸出結(jié)果:


到此這篇關(guān)于OpenCV半小時掌握基本操作之直線檢測的文章就介紹到這了,更多相關(guān)OpenCV直線檢測內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Python虛擬環(huán)境venv配置文件pyvenv.cfg的實現(xiàn)
本文主要介紹了Python虛擬環(huán)境(venv)的配置文件pyvenv.cfg中的各個配置項及其含義,文中通過示例代碼介紹的非常詳細(xì),需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2025-02-02
Python開發(fā)寶典CSV JSON數(shù)據(jù)處理技巧詳解
在Python中處理CSV和JSON數(shù)據(jù)時,需要深入了解這兩種數(shù)據(jù)格式的讀取、寫入、處理和轉(zhuǎn)換方法,下面將詳細(xì)介紹如何在Python中處理CSV和JSON數(shù)據(jù),并提供一些示例和最佳實踐2023-11-11
Python數(shù)據(jù)分析之獲取雙色球歷史信息的方法示例
這篇文章主要介紹了Python數(shù)據(jù)分析之獲取雙色球歷史信息的方法,涉及Python網(wǎng)頁抓取、正則匹配、文件讀寫及數(shù)值運算等相關(guān)操作技巧,需要的朋友可以參考下2018-02-02
Python中用startswith()函數(shù)判斷字符串開頭的教程
這篇文章主要介紹了Python中用startswith()函數(shù)判斷字符串開頭的教程,startswith()函數(shù)的使用是Python學(xué)習(xí)中的基礎(chǔ)知識,本文列舉了一些不同情況下的使用結(jié)果,需要的朋友可以參考下2015-04-04
人工智能學(xué)習(xí)Pytorch梯度下降優(yōu)化示例詳解
這篇文章主要為大家介紹了人工智能學(xué)習(xí)Pytorch梯度下降優(yōu)化示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步早日升職加薪2021-11-11
Python接收Gmail新郵件并發(fā)送到gtalk的方法
這篇文章主要介紹了Python接收Gmail新郵件并發(fā)送到gtalk的方法,實例分析了Python操作郵件的技巧,具有一定參考借鑒價值,需要的朋友可以參考下2015-03-03
Pandas數(shù)據(jù)分析常用函數(shù)的使用
本文主要介紹了Pandas數(shù)據(jù)分析常用函數(shù)的使用,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-01-01

