網(wǎng)站首頁 編程語言 正文
直線檢測原理
核心要點:圖像坐標空間、參數(shù)空間、極坐標參數(shù)空間 -> (極坐標)參數(shù)空間表決
給定一個點,我們一般會寫成y=ax+b的形式,這是坐標空間的寫法;我們也可以寫成b=-xa+y的形式,這是參數(shù)空間的寫法。也就是說,給定一個點,那么經(jīng)過該點的直線的參數(shù)必然滿足b=-xa+y這一條件,也就是必然在參數(shù)空間中b=-xa+y這條直線上。如果給定兩個點,那么這兩點確定的唯一的直線的參數(shù),就是參數(shù)空間中兩條參數(shù)直線的交點。
由于上述寫法不適合處理水平或垂直的直線,我們可以使用極坐標的形式描述直線,即ρ=xcosθ+ysinθ,其中ρ是從原點到直線的垂直距離,θ是由這條垂直線和水平軸形成的角度(以逆時針方向測量),
如下圖所示:
因此,任何垂直線θ=0,水平線θ=90°。那么極坐標參數(shù)空間中的曲線交點就是由兩個點確定的一條直線,如下圖所示。
現(xiàn)在讓我們看看Hough變換是如何處理直線的。任何一條線都可以用這兩個參數(shù)來表示(ρ,θ)。
- 首先創(chuàng)建一個二維數(shù)組,即累加器,用來保存兩個參數(shù)的值,然后最初將其設(shè)置為全0。讓行表示ρ,列表示θ。數(shù)組的尺寸取決于所需的精度。假設(shè)希望角度的精度為1度,則需要180列,枚舉0°-179°的所有情況。對于ρ,可能的最大距離是圖像的對角線長度。因此,以一個像素的精度計算,行數(shù)可以是圖像的對角線長度。
- 枚舉所有的點,對于每一個點,將所有經(jīng)過這一點的直線對應(yīng)的參數(shù)(ρ,θ)在參數(shù)空間中找到對應(yīng)位置,令該位置的累加器加1,即投票。這一過程如下圖所示。
枚舉完成所有點之后,累加器中值最大的(若干個)參數(shù)組合(ρ,θ)就是經(jīng)過點最多的(若干條)直線,如下圖所示,兩條直線對應(yīng)累加器中最亮的兩個點。
總的來說,對于多個點,我們可以用(離散)參數(shù)空間表決的方法,記錄每個點對應(yīng)的允許的參數(shù)組合,求得那些被允許次數(shù)最多的參數(shù)組合,就是最多點經(jīng)過的直線。
在圖像矯正任務(wù)中,我們經(jīng)過Canny算子檢測出了若干邊緣點,這些點主要集中在四個邊界上,因此我們只需要使用Hough直線檢測,求出四條直線,就能確定四個邊界。
OpenCV實現(xiàn)
cv.HoughLines()封裝了上述步驟,該函數(shù)原型為:
cv.HoughLines(image, rho, theta, threshold[, lines[, srn[, stn[, min_theta[, max_theta]]]]]) -> lines
參數(shù):
- lines:數(shù)組,每一個元素都是一條直線對應(yīng)的(ρ, θ),ρ以像素為單位,θ以弧度為單位。
- image:輸入圖像,需要是二值圖像,所以在應(yīng)用hough變換之前應(yīng)用閾值或canny邊緣檢測。
- rho:ρ的精度。
- theta:θ的精度。
- threshold:閾值,得票數(shù)高于該值的線才被認為是線,由于投票數(shù)取決于線上的點數(shù),所以它代表了應(yīng)該被檢測到的線的最小點數(shù)。
下面是具體代碼:
def hough_detect(image_path):
# 讀取圖像并轉(zhuǎn)換為灰度圖像
image = cv2.imread(image_path)
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
# 使用Canny算子檢測邊緣
edges = canny_detect(image_path, False)
# 使用Hough檢測直線
lines = cv2.HoughLines(edges, 1, np.pi/180, 200)
# 繪制直線
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(image, (x1, y1), (x2, y2), (0, 0, 255), 2)
cv2.imshow('line,jpg', image)
cv2.waitKey()
hough_detect('images/2.jpeg')
效果:
后面需要調(diào)整一下超參數(shù)。
原文鏈接:https://blog.csdn.net/qq_41112170/article/details/125729006
相關(guān)推薦
- 2022-06-17 C#中Parallel類For、ForEach和Invoke使用介紹_C#教程
- 2022-08-29 React合成事件原理解析_React
- 2021-12-09 Jenkins+GitLab+Docker持續(xù)集成LNMP
- 2022-10-23 Kotlin全局捕捉協(xié)程異常方法詳解_Android
- 2022-04-10 關(guān)于C#中GUI編程的標準事件問題_C#教程
- 2022-08-31 Android無障礙監(jiān)聽通知的實戰(zhàn)過程_Android
- 2023-02-17 python引入其他py文件或模塊_python
- 2022-10-19 Python?變量教程字節(jié)對象與字符串_python
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細win安裝深度學習環(huán)境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎(chǔ)操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權(quán)
- redisson分布式鎖中waittime的設(shè)
- maven:解決release錯誤:Artif
- restTemplate使用總結(jié)
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務(wù)發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結(jié)構(gòu)-簡單動態(tài)字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應(yīng)用詳解
- 聊聊消息隊列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支