在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

基于OpenCV經典霍夫變換的一些內容

新機器視覺 ? 來源:古月居 ? 作者:Eragonl ? 2021-07-06 10:43 ? 次閱讀

本文主要講述的是霍夫變換的一些內容,并加入一些在生活中的應用,希望能對讀者對于霍夫變換的內容有所了解。

首先我先說的是,霍夫變換是一個特征提取技術。其可用于隔離圖像中特定形狀的特征的技術,應用在圖像分析、計算機視覺和數字圖像處理領域。目的是通過投票程序在特定類型的形狀內找到對象的不完美實例。

這個投票程序是在一個參數空間中進行的,在這個參數空間中,候選對象被當作所謂的累加器空間中的局部最大值來獲得,所述累加器空間由用于計算霍夫變換的算法明確地構建。此處我們主要介紹的是比較基本的霍夫變換在直線中的應用,例如在圖像中檢測直線(線段),Hough變換的主要優點是對于噪聲有良好的魯棒性。

基礎原理介紹

正如我們上面所介紹的那樣,霍夫變換最簡單的是檢測直線。我們知道,直線的方程表示可以由斜率k和截距b表示(這種表示方法,稱為斜截式,也就是高中的時候學習到的一種常用形式),如下所示:

y=kx+b

如果我們用參數空間表示則為(b,k),即,我們可以用斜率和截距就能表示一條直線。但這種形式會產生一個問題,那就是當我們的直線斜率k為無限大的時候(即垂線),這會使得該直線無法使用斜截式來進行表示,此處我們需要使用到另一種直線的表現形式:黑塞法線式(或者簡稱為法線式):

r=xcosθ+ysinθ

其中r是原點到直線上最近點的距離(其他人可能把這記錄為ρ,下面也可以把r看成參數ρ,兩者含義相同),θ是x軸與連接原點和最近點直線之間的夾角。

從而我們可以將圖像的每一條直線與一對參數(r,θ)相關聯。由參數(r,θ)構成的平面有時被稱為霍夫空間,用于表示二維直線所構成的集合。

我們經過Hough變換后,我們圓來笛卡爾坐標系中的一個點可以映射到Hough空間中去。

經過原笛卡爾坐標系中的定點(3,4),通過該點的所有可能直線的(r,θ)的關系。顯示了在極坐標對極徑極角平面繪出所有通過該定點的直線, 將得到一條正弦曲線。正弦曲線的形狀取決于,點到所定義原點的距離r。通常,r越大,正弦曲線的振幅越大,反之則會越小。

所以我們可以得到一個結論,給定平面中的單個點,那么通過該點的所有直線的集合對應于(r,θ)平面中的正弦曲線,這對于該點是獨特的。一組兩個或更多點形成一條直線將產生在該線的(r,θ)處交叉的正弦曲線。因此,檢測共線點的問題可以轉化為找曲線相交點的問題。

例:

考慮下面三個點,這里顯示為黑點。

(注:此處也展示了霍夫變換的幾個基本步驟:首先,對每個點均繪制不同角度的線條,這些線全部經過各自的對應點并顯示為實線。其次,對于每條實線,找到經過原點的對應垂線并顯示為虛線。然后找到虛線的長度和角度。這些值顯示在圖表下方的表格中。這對被轉換的三個點中的每一個都重復該過程。然后將結果繪制成圖,有時稱為霍夫空間圖)

曲線相交的點給出的距離和角度表示各個測試點相交的線。

分析上下文,邊緣段的點(一個或多個)的坐標(xi,yi)在圖像中是已知的,并且因此作為參數線等式中的常量,而r與θ是未知變量是我們要尋找的。如果我們繪制由(r,θ)每個定義的可能值(xi,yi)。

笛卡爾圖像空間中的點映射到霍夫參數空間中的曲線(正弦曲線)。這個點到曲線的變換是直線的霍夫變換。當在霍夫參數空間中查看時,在笛卡爾圖像空間中共線的點變得很明顯,因為它們產生在相同(r,θ)點相交的曲線。

霍夫變換提取直線

我們通過將霍夫參數空間量化為有限間隔或累加器單元來實現變換。隨著算法的運行,每個算法都把(xi,yi)轉換為一個離散化的 (r,θ)曲線,并且沿著這條曲線的累加器單元被遞增。累加器陣列中產生的峰值表示圖像中存在相應的直線的相應證明。

此時需要注意的是,現在我們考慮的是直線的霍夫變換。累加器陣列的維度是二維的(也就是r和θ)。

那么對于圖像來說,(x,y)處的每個像素及其鄰域,霍夫變換算法被用于確定該像素是否有足夠的直線證據。如果是,它將計算該線的參數 (r,θ),然后查找參數落入的累加器箱,并增加該箱的值(投票值)。通過查找具有最高值的箱,通常通過查找累加器空間中的局部最大值,可以提取最可能的線,并且讀出它們的(近似的)幾何定義。

找到這些峰值的最簡單方法是通過應用某種形式的閾值,但其他技術可能在不同情況下產生更好的結果。由于返回的行不包含任何長度信息,因此通常有必要在下一步中查找圖像的哪些部分與哪些行匹配。此外,由于邊緣檢測步驟中存在缺陷誤差,通常會在累加器空間中出現錯誤,這可能使得找到合適的峰值以及適當的線條變得非常重要。

線性霍夫變換的最終結果是類似于累加器的二維陣列(矩陣),該矩陣的一個維度是量化角度θ,另一個維度是量化距離r。矩陣的每個元素的值等于位于由量化參數 (r,θ)表示的線上的點或像素的總和。

所以具有最高值的元素表示輸入圖像中代表最多的直線。我們也可以把累計器單元的結果認為是投票值。換句話說,將每個交點看成一次投票,也就是說A(r,θ)=A(r,θ)+1,所有點都如此進行計算后,可以設置一個閾值,投票大于這個閾值的可以認為是找到的直線。

霍夫變換提取圓

而當我們需要去進行圓檢測的時候,我們累加器是三維累加器,在圓檢測的情況下,我們可以知道的是其對應的參數方程為:

(x?a)2+(y?b)2=r2

其中a和b是圓心的坐標并且是r半徑。在這種情況下,算法的計算復雜度開始增加,因為我們現在在參數空間和三維累加器中有三個坐標。(通常,累加器陣列的計算和大小隨著參數數量的增加而多項式增加,因此,基本霍夫技術僅適用于簡單曲線。)

它的算法步驟如下:

1.首先創建累加器空間,由每個像素單元格構成。最初每個單元格都設置為0。

2.然后對于每個圖像中的邊緣點(i,j),按照圓方程(i?a)2+(j?b)2=r2將那些可能是一個圓中心的單元格值進行累加。這些單元格在等式中由字母a表示。

3.然后在前面的步驟中由每個可能找到的值a,區找到滿足等式的所有可能值b。

4.搜索累加器空間中的局部最大值。這些單元格表示算法檢測到的圓圈。

如果我們不知道事先定位的圓的半徑,可以使用三維累加器空間來搜索具有任意半徑的圓。當然,這在計算上更加昂貴。

該方法還可以檢測部分位于累加器空間外部的圓,只要該圓的區域內仍有足夠的圓。

總結

霍夫變換在很多地方都有著應用,如果是在OpenCV(Python)下想要使用霍夫變換,只需要使用函數cv2.HoughLinesP函數,需要注意的是該函數并不是標準的霍夫變換,其為:概率霍夫變換,它只分析點的子集并估計這些點都屬于一條直線的概率,這是標準霍夫變換的優化版本。該函數計算代價少,執行更快,但準確度有一定程度的下降。

cv2.HoughLinesP函數的語法如下:

cv2.HoughLinesP(image,rho,theta,threshold,minLineLength,maxLineGap)

其參數分別解釋如下:

·image:要處理的二值圖像;·rho:線段的幾何表示,表示取距離的間隔,一般取1;·theta:線段的幾何表示,表示取角度的間隔,一般取np.pi/180;·threshold:閾值,低于該閾值的會被忽略;·minLineLength:最小直線長度,小于該長度會被忽略;·maxLineGap:最大線段間隙,大于此間隙才被認為是兩條直線。

霍夫變換在自動駕駛中也有所應用,可以如下面一個簡單例子所示,其實現的是對我們畫面中的道路直線進行的檢測:

import osimport reimport cv2import numpy as np

# 初始化一個掩膜def mask_create(): img = cv2.imread(‘0.png’) zero = np.zeros_like(img[:, :, 0]) poly = np.array([[50, 270], [220, 160], [345, 160], [480, 270]]) zero_fixed = cv2.fillConvexPoly(zero, poly, (255, 255, 255)) return zero_fixed

# 掩膜計算,傳入的圖像需要是BGR圖def mask_calc(frame, mask): img = cv2.bitwise_and(frame[:, :, 0], frame[:, :, 0], mask=mask) return img

# 圖像閾值操作,傳入的圖片需要是灰度圖def threshold(low, high, img): ret, thresh = cv2.threshold(img, low, high, cv2.THRESH_BINARY) return thresh

# 對圖像進行霍夫變換,輸入的圖像需要是二值圖,距離r為1,旋轉角為1度,投票閾值為30,最遠距離為200像素# 并在原圖上進行繪制圖像def hough(thresh, img): lines = cv2.HoughLinesP(thresh, 1, np.pi/180, 30, maxLineGap=200) try: for line in lines: x1, y1, x2, y2 = line[0] img = cv2.line(img, (x1, y1), (x2, y2), (255, 255, 255), 3) except: return img else: return img# 主函數def mainn(): # 讀取數據 col_frames = os.listdir(‘。。/frames/’) # 排序 col_frames.sort(key=lambda f: int(re.sub(‘D’, ‘’, f))) # 讀取畫面每一幀 for i in col_frames: img = cv2.imread(i) # 構建一個掩膜 mask = mask_create() # 對原圖像進行掩膜計算 masked_frame = mask_calc(img, mask) thresh = threshold(135, 255, masked_frame) img = hough(thresh, img) cv2.imshow(‘img’, img) if cv2.waitKey(40) == ord(‘q’): break cv2.destroyAllWindows()

mainn()

編輯:jq

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 函數
    +關注

    關注

    3

    文章

    4363

    瀏覽量

    63797
  • OpenCV
    +關注

    關注

    31

    文章

    641

    瀏覽量

    42219
  • python
    +關注

    關注

    56

    文章

    4822

    瀏覽量

    85804

原文標題:[OpenCV]經典霍夫變換原理

文章出處:【微信號:vision263com,微信公眾號:新機器視覺】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    AN29-關于DC-DC轉換器的一些想法

    電子發燒友網站提供《AN29-關于DC-DC轉換器的一些想法.pdf》資料免費下載
    發表于 01-08 13:57 ?0次下載
    AN29-關于DC-DC轉換器的<b class='flag-5'>一些</b>想法

    一些常見的動態電路

    無論是模電還是數電,理論知識相對來說還是比較枯燥,各種電路原理理解清楚不算容易,換種生動形象的方式或許會增加一些趣味性,也更容易理解這些知識。下面整理了一些常見的電路,以動態圖形的方式展示。 整流
    的頭像 發表于 11-16 09:26 ?832次閱讀
    <b class='flag-5'>一些</b>常見的動態電路

    經典傅里葉變換與快速傅里葉變換的區別

    經典傅里葉變換與快速傅里葉變換(FFT)在多個方面存在顯著的區別,以下是對這兩者的比較: 、定義與基本原理 經典傅里葉
    的頭像 發表于 11-14 09:37 ?920次閱讀

    分享一些常見的電路

    理解模電和數電的電路原理對于初學者來說可能比較困難,但通過一些生動的教學方法和資源,可以有效地提高學習興趣和理解能力。 下面整理了一些常見的電路,以動態圖形的方式展示。 整流電路 單相橋式整流
    的頭像 發表于 11-13 09:28 ?623次閱讀
    分享<b class='flag-5'>一些</b>常見的電路

    歐姆定律和基爾霍夫定律的區別

    歐姆定律和基爾霍夫定律是電路學中兩個重要的定律,它們各自描述了電路中不同的現象和規律。以下是它們之間的主要區別: 、定義與內容 歐姆定律 定義:描述電流、電壓和電阻之間關系的基本定律。 內容
    的頭像 發表于 10-28 15:19 ?1121次閱讀

    dct變換的主要優點有哪些

    中的少數幾個系數中,從而實現高效的壓縮。以下是DCT變換一些主要優點: 能量壓縮 :DCT的個顯著優點是它能夠將圖像的能量集中在變換后的低頻系數中。這意味著圖像中最重要的信息(通常
    的頭像 發表于 09-30 16:30 ?1005次閱讀

    LED驅動器應用的一些指南和技巧

    電子發燒友網站提供《LED驅動器應用的一些指南和技巧.pdf》資料免費下載
    發表于 09-25 11:35 ?0次下載
    LED驅動器應用的<b class='flag-5'>一些</b>指南和技巧

    博威合金攜手貝肯(中國)亮相埃森焊接展,打造焊材定制化解決方案

    博威合金與貝肯(中國)在埃森焊接展展出的系列焊接材料解決方案,充分展現了其在研發、制造和應用中的深度融合,精準匹配了新能源汽車、鋁罐車、自行車等產業的差異化焊接需求。
    的頭像 發表于 08-15 15:03 ?630次閱讀
    博威合金攜手貝肯<b class='flag-5'>霍</b><b class='flag-5'>夫</b>(中國)亮相埃森焊接展,打造焊材定制化解決方案

    節點電位法適用于什么的電路

    節點電位法(Node Voltage Method)是電路分析中的種基本方法,主要用于求解線性電路中的節點電壓。該方法基于基爾霍夫電流定律(Kirchhoff's Current Law,KCL
    的頭像 發表于 08-06 17:06 ?1499次閱讀

    Python遞歸的經典案例

    當我們碰到諸如需要求階乘或斐波那契數列的問題時,使用普通的循環往往比較麻煩,但如果我們使用遞歸時,會簡單許多,起到事半功倍的效果。這篇文章主要和大家分享一些和遞歸有關的經典案例,結合一些資料談
    的頭像 發表于 08-05 15:57 ?517次閱讀

    基爾霍夫定律的基本概念、數學表達及應用方法

    、引言 電路是電子技術的基礎,而電路分析則是電子技術的核心。在電路分析中,基爾霍夫定律是最基本的定律之,它包括基爾霍夫電流定律(KCL)和基爾
    的頭像 發表于 07-17 11:09 ?4290次閱讀

    opencv圖像識別有什么算法

    OpenCV(Open Source Computer Vision Library)是個開源的計算機視覺和機器學習軟件庫,提供了大量的圖像處理和計算機視覺相關的算法。以下是一些常見的Ope
    的頭像 發表于 07-16 10:40 ?1542次閱讀

    opencv-python和opencv樣嗎

    -Python是OpenCV個Python語言接口,它允許開發者使用Python語言來調用OpenCV庫的功能。 雖然OpenCVOpenCV
    的頭像 發表于 07-16 10:38 ?1773次閱讀

    opencv的主要功能有哪些

    OpenCV(Open Source Computer Vision Library)是個開源的計算機視覺庫,提供了大量的計算機視覺算法和工具。以下是OpenCV的主要功能: 圖像處理
    的頭像 發表于 07-16 10:35 ?2340次閱讀

    咨詢一些關于LED燈具的問題

    各位大佬,咨詢一些關于LED燈具的問題 120W的吸頂燈,用的非隔離式電源,用不到1年,燈具就會閃爍、頻閃或不亮,主要是什么原因造成的?是不是驅動芯片太差?
    發表于 07-02 22:33
    主站蜘蛛池模板: xxxx曰本| 黄在线观看网站 | 激情六月丁香婷婷 | 五月婷婷影视 | 热99久久| 黄色一级片毛片 | 成人免费无毒在线观看网站 | 欧美一级视频在线观看欧美 | 美女中出视频 | 日本亚洲卡一卡2卡二卡三卡四卡 | 九九热在线免费观看 | 91精品国产亚洲爽啪在线影院 | 你懂的在线视频播放 | 天天噜日日噜夜夜噜 | 亚洲成在人色婷婷 | 在线视频亚洲 | 久久成人免费网站 | 免费的黄视频 | 456成人网| 日本色网址| 欧美成人午夜毛片免费影院 | 欧洲不卡一卡2卡三卡4卡网站 | 美女黄18以下禁止观看 | 五月天激情在线 | 午夜激情小视频 | 美女又黄又免费 | 女人张开双腿让男人桶完整 | 免费黄色一级毛片 | 欧美性第一页 | 一级毛片美国一级j毛片不卡 | 狠狠色噜噜狠狠狠狠97老肥女 | 五月婷婷在线视频观看 | 最好看免费中文字幕2018视频 | 国产亚洲欧美一区二区 | 看黄视频免费 | 国产精品嫩草影院在线播放 | 末成年一级在线看片 | 国产亚洲精品在天天在线麻豆 | 奇米第四狠狠777高清秒播 | 在线免费视频手机版 | 日本免费黄色大片 |