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

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程语言 > python >内容正文

python

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

發(fā)布時(shí)間:2023/12/19 python 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 python 霍夫直线变换_OpenCV-Python 霍夫线变换 | 三十二 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

目標(biāo)

在這一章當(dāng)中,

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

我們將看到如何使用它來(lái)檢測(cè)圖像中的線條。

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

理論

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

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

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

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

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

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

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

OpenCV中的霍夫曼變換

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

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)

檢查下面的結(jié)果

概率霍夫變換

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

OpenCV的實(shí)現(xiàn)基于Matas,J.和Galambos,C.和Kittler, J.V.使用漸進(jìn)概率霍夫變換對(duì)行進(jìn)行的穩(wěn)健檢測(cè)[145]。使用的函數(shù)是cv.HoughLinesP()。它有兩個(gè)新的論點(diǎn)。

minLineLength - 最小行長(zhǎng)。小于此長(zhǎng)度的線段將被拒絕。

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

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

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)

看到如下結(jié)果:

附加資源

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

創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎(jiǎng)勵(lì)來(lái)咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎(jiǎng)

總結(jié)

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

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。