国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Python > 正文

利用Opencv中Houghline方法實現直線檢測

2020-01-04 15:52:31
字體:
來源:轉載
供稿:網友

利用Opencv中的Houghline方法進行直線檢測—python語言

這是給Python部落翻譯的文章,請在這里看原文

在圖像處理中,霍夫變換用來檢測任意能夠用數學公式表達的形狀,即使這個形狀被破壞或者有點扭曲。

下面我們將看到利用HoughLine算法來闡述霍夫變化進行直線檢測的原理,把此算法應用到特點圖像的邊緣檢測是可取的。邊緣檢測方法請參考這篇文章–邊緣檢測。

Houghline算法基礎

直線可以表示為y=mx+c,或者以極坐標形式表示為r=xcosθ+ysinθ,其中r是原點到直線的垂直距離,θ是水平軸順時針方向到垂直線的夾角(這個方向取決于坐標的形式,在OpenCV就是采用這種極坐標形式)。

Opencv,Houghline,直線檢測

因此任意的曲線都可以用兩個參數(r,θ)表示。

HoughLine算法原理:

  • 首先建立一個二維的數組或者累加器(用來保存這兩個參數),并初始化為零;
  • 這個二維數組的行代表不同的r,而列代表角度θ;
  • 數組的大小取決于算法的精度。假設所需角度的精度精確到1°,那么就需要180列(直線的最大角度是180)。
  • 對于r,最大的可能距離是圖像的對角長度,因此若需要一個像素的精度,那么需要把行數設為圖像對角線的長度。

例子:

假設一幅100x100的圖像,在圖像中間有一條水平直線。設直線的第一個點的坐標為(x,y),在直線方程中,令參數θ=0,12,?,180,觀查參數r變化。對每一個參數對(r,θ),在累加器中將(r,θ)對應的單元格中的值遞增1,比如現在在累加器中,某個單元(50,90)的值等于1,其它的值也如此。

對于直線上的第二個點,重復上述操作。將得到的參數對(r,θ)的對應值繼續遞增,然后(50,90)對應的值等于2。實現上我們是對參數對(r,θ)進行投票,對直線上的每一個點重復上述操作,對每一個點,單元格(50,90)對應的值會遞增,或者說投票給參數對(50,90),而會或者不會投票給其它參數對。以這種方式,最后單元格(50,90)的值將會是最大的值。然后搜索累加器的最大值,將會找到參數對(50,90)。也就是說,在圖像中找到了到原點距離為50,角度為90的一條直線。

Opencv,Houghline,直線檢測

上述算法的過程被封裝成OpenCV函數cv2.HoughLines(),函數返回(r,θ)的一個數組,其中r的單位為像素,θ的單位為弧度。

# Python program to illustrate HoughLine# method for line detectionimport cv2import numpy as np# Reading the required image in # which operations are to be done. # Make sure that the image is in the same # directory in which this python program isimg = cv2.imread('xyz.jpg')# Convert the img to grayscalegray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)# Apply edge detection method on the imageedges = cv2.Canny(gray,50,150,apertureSize = 3)# This returns an array of r and theta valueslines = cv2.HoughLines(edges,1,np.pi/180, 200)# The below for loop runs till r and theta values # are in the range of the 2d arrayfor r,theta in lines[0]: # Stores the value of cos(theta) in a a = np.cos(theta) # Stores the value of sin(theta) in b b = np.sin(theta) # x0 stores the value rcos(theta) x0 = a*r # y0 stores the value rsin(theta) y0 = b*r # x1 stores the rounded off value of (rcos(theta)-1000sin(theta)) x1 = int(x0 + 1000*(-b)) # y1 stores the rounded off value of (rsin(theta)+1000cos(theta)) y1 = int(y0 + 1000*(a)) # x2 stores the rounded off value of (rcos(theta)+1000sin(theta)) x2 = int(x0 - 1000*(-b)) # y2 stores the rounded off value of (rsin(theta)-1000cos(theta)) y2 = int(y0 - 1000*(a)) # cv2.line draws a line in img from the point(x1,y1) to (x2,y2). # (0,0,255) denotes the colour of the line to be  #drawn. In this case, it is red.  cv2.line(img,(x1,y1), (x2,y2), (0,0,255),2)# All the changes made in the input image are finally# written on a new image houghlines.jpgcv2.imwrite('houghlines3.jpg', img)

函數(cv2.HoughLines(edges, 1, np.pi/180,200))

  • 第一個參數是輸入圖像,且必須是二值圖像,在進行霍夫變換之前需要采用閾值方法的邊緣檢測;
  • 第二和第三個參數分別是r,θ對應的精度;
  • 第四個參數是閾值,判定為直線投票數的最小值;
  • 注意,投票數取決于直線上點的個數,因此這個閾值代表了檢測到的直線的最短長度。

Opencv,Houghline,直線檢測

總結

  • 在圖像分析應用中,邊緣分割點的坐標(即X,Y)是已知的,在直線的參數方程中作為輸入,而r,θ是我們要找的未知變量;
  • 對每一個角度θ,求出r的值,也就是將笛卡爾圖像空間的點映射到霍夫參數極坐標空間的曲線,這種點到曲線的變換就是直線的霍夫變換;
  • 這種變換是通過量化霍夫參數為有限的間隔或者累加器單元來實現的,隨著算法的運行,每一個(X,Y)轉換成離散的(r,θ)曲線,曲線上的點對應的累加器(二維數組)的值會遞增;
  • 累加器中的峰值就代表了圖像中有相應直線的存在。

霍夫變換的應用

  • 用于分離圖像中特殊形狀的特征;
  • 可以容忍特征邊界描述的誤差,并且不受噪聲的干擾;
  • 廣泛用于條形碼掃描、驗證和識別。

文章作者是Pratima Upadhyay,如果你喜歡GeeksforGeeks,并且愿意分享,可以利用contribute.geeksforgeeks.org寫文章,然后發送到contribute@geeksforgeeks.org,在GeeksforGeeks中看到自己的文章,幫助更多的Geeks。

若發現錯誤歡迎指正,也歡迎評論。

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持VEVB武林網。


注:相關教程知識閱讀請移步到python教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 星子县| 连平县| 瓮安县| 左权县| 虞城县| 饶阳县| 紫金县| 玛多县| 邵东县| 罗城| 通榆县| 云梦县| 通渭县| 达日县| 永胜县| 沂南县| 上饶市| 衡东县| 麟游县| 青阳县| 和林格尔县| 大余县| 天门市| 万年县| 上林县| 高清| 廉江市| 营口市| 抚顺县| 南澳县| 理塘县| 共和县| 贺州市| 五原县| 丰城市| 余庆县| 临江市| 亚东县| 吕梁市| 沛县| 湖口县|