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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

python 霍夫直线变换_OpenCV-Python 霍夫线变换 | 三十二

發布時間:2023/12/19 python 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 python 霍夫直线变换_OpenCV-Python 霍夫线变换 | 三十二 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

目標

在這一章當中,

我們將了解霍夫變換的概念。

我們將看到如何使用它來檢測圖像中的線條。

我們將看到以下函數:cv.HoughLines(),cv.HoughLinesP()

理論

如果可以用數學形式表示形狀,則霍夫變換是一種檢測任何形狀的流行技術。即使形狀有些破損或變形,也可以檢測出形狀。我們將看到它如何作用于一條線。

一條線可以表示為y=mxcy = mx cy=mxc或以參數形式表示為ρ=xcosθysinθ\rho=xcosθ ysinθρ=xcosθysinθ,其中ρ\rhoρ是從原點到該線的垂直距離,而θ\thetaθ是由該垂直線和水平軸形成的角度以逆時針方向測量(該方向隨您如何表示坐標系而變化。此表示形式在OpenCV中使用)。查看下面的圖片:

因此,如果線在原點下方通過,則它將具有正的ρ\rhoρ且角度小于180。如果線在原點上方,則將角度取為小于180,而不是大于180的角度。ρ\rhoρ取負值。任何垂直線將具有0度,水平線將具有90度。

現在,讓我們看一下霍夫變換如何處理線條。任何一條線都可以用(ρ,θ)(ρ,θ)(ρ,θ)這兩個術語表示。因此,首先創建2D數組或累加器(以保存兩個參數的值),并將其初始設置為000。讓行表示ρρρ,列表示θθθ。陣列的大小取決于所需的精度。假設您希望角度的精度為1度,則需要180列。對于ρρρ,最大距離可能是圖像的對角線長度。因此,以一個像素精度為準,行數可以是圖像的對角線長度。

考慮一個100x100的圖像,中間有一條水平線。取直線的第一點。您知道它的(x,y)值。現在在線性方程式中,將值θθθ= 0,1,2,… 180放進去,然后檢查得到ρρρ。對于每對(ρ,θ)(ρ,θ)(ρ,θ),在累加器中對應的(ρ,θ)(ρ,θ)(ρ,θ)單元格將值增加1。所以現在在累加器中,單元格(50,90)= 1以及其他一些單元格。

現在,對行的第二個點。執行與上述相同的操作。遞增(ρ,θ)(\rho,\theta)(ρ,θ)對應的單元格中的值。這次,單元格(50,90)=2。實際上,您正在對(ρ,θ)(ρ,θ)(ρ,θ)值進行投票。您對線路上的每個點都繼續執行此過程。在每個點上,單元格(50,90)都會增加或投票,而其他單元格可能會或可能不會投票。這樣一來,最后,單元格(50,90)的投票數將最高。因此,如果您在累加器中搜索最大票數,則將獲得(50,90)值,該值表示該圖像中的一條線與原點的距離為50,角度為90度。在下面的動畫中很好地顯示了該圖片(圖片提供:Amos Storkey)

這就是霍夫變換對線條的工作方式。它很簡單,也許您可??以自己使用Numpy來實現它。下圖顯示了累加器。某些位置的亮點表示它們是圖像中可能的線條的參數。(圖片由維基百科提供)

OpenCV中的霍夫曼變換

上面說明的所有內容都封裝在OpenCV函數cv.HoughLines()中。它只是返回一個:math:(rho,theta)值的數組。ρρρ以像素為單位,θθθ以弧度為單位。第一個參數,輸入圖像應該是二進制圖像,因此在應用霍夫變換之前,請應用閾值或使用Canny邊緣檢測。第二和第三參數分別是ρρρ和θθθ精度。第四個參數是閾值,這意味著應該將其視為行的最低投票。請記住,票數取決于線上的點數。因此,它表示應檢測到的最小線長。

import cv2 as cv

import numpy as np

img = cv.imread(cv.samples.findFile('sudoku.png'))

gray = cv.cvtColor(img,cv.COLOR_BGR2GRAY)

edges = cv.Canny(gray,50,150,apertureSize = 3)

lines = cv.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))

cv.line(img,(x1,y1),(x2,y2),(0,0,255),2)

cv.imwrite('houghlines3.jpg',img)

檢查下面的結果

概率霍夫變換

在霍夫變換中,您可以看到,即使對于帶有兩個參數的行,也需要大量計算。概率霍夫變換是我們看到的霍夫變換的優化。它沒有考慮所有要點。取而代之的是,它僅采用隨機的點子集,足以進行線檢測。只是我們必須降低閾值。參見下圖,比較了霍夫空間中的霍夫變換和概率霍夫變換。(圖片提供:Franck Bettinger的主頁)

OpenCV的實現基于Matas,J.和Galambos,C.和Kittler, J.V.使用漸進概率霍夫變換對行進行的穩健檢測[145]。使用的函數是cv.HoughLinesP()。它有兩個新的論點。

minLineLength - 最小行長。小于此長度的線段將被拒絕。

maxLineGap - 線段之間允許將它們視為一條線的最大間隙。

最好的是,它直接返回行的兩個端點。在以前的情況下,您僅獲得線的參數,并且必須找到所有點。在這里,一切都是直接而簡單的。

import cv2 as cv

import numpy as np

img = cv.imread(cv.samples.findFile('sudoku.png'))

gray = cv.cvtColor(img,cv.COLOR_BGR2GRAY)

edges = cv.Canny(gray,50,150,apertureSize = 3)

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

for line in lines:

x1,y1,x2,y2 = line[0]

cv.line(img,(x1,y1),(x2,y2),(0,255,0),2)

cv.imwrite('houghlines5.jpg',img)

看到如下結果:

附加資源

Hough Transform on Wikipedia:http://en.wikipedia.org/wiki/Hough_transform

創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎

總結

以上是生活随笔為你收集整理的python 霍夫直线变换_OpenCV-Python 霍夫线变换 | 三十二的全部內容,希望文章能夠幫你解決所遇到的問題。

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