1. 程式人生 > >霍夫變換原理及實現

霍夫變換原理及實現

霍夫變換是影象處理必然接觸到的一個演算法,為了檢測出來直線和圓,橢圓之類的形狀。
比較好的教程霍夫變換原理
霍夫變換實現步驟:

import cv2

import numpy as np

def hough_detectline(img):

   thetas=np.deg2rad(np.arange(0,180))


   row,cols=img.shape

   diag_len=np.ceil(np.sqrt(row**2+cols**2))

   rhos=np.linspace(-diag_len,diag_len,int(2*diag_len))

   cos_t=np.cos
(thetas) sin_t=np.sin(thetas) num_theta=len(thetas) #vote vote=np.zeros((int(2*diag_len),num_theta),dtype=np.uint64) y_inx,x_inx=np.nonzero(img) #vote in hough space for i in range(len(x_inx)): x=x_inx[i] y=y_inx[i] for j in range(num_theta): rho=round(x
*cos_t[j]+y*sin_t[j])+diag_len if isinstance(rho,int): vote[rho,j]+=1 else: vote[int(rho),j]+=1 return vote,rhos,thetas #image = cv2.imread(r'C:\Users\Y\Desktop\input_0.png') #image_gray=cv2.cvtColor(image,cv2.COLOR_BGR2GRAY) #image_binary=cv2.Canny(image_gray,150,255)
image = np.zeros((500,500)) image[10:100, 10:100] = np.eye(90) accumulator, rhos,thetas= hough_detectline(image) #look for peaks idx = np.argmax(accumulator) rho = rhos[int(idx/accumulator.shape[1])] theta = thetas[idx % accumulator.shape[1]] k=-np.cos(theta)/np.sin(theta) b=rho/np.sin(theta) x=np.float32(np.arange(1,150,2)) #要在image 上畫必須用float32,要不然會報錯(float不行) y=np.float32(k*x+b) cv2.imshow("original image",image),cv2.waitKey(0) for i in range(len(x)-1): cv2.circle(image,(x[i],y[i]),5,(255,0,0),1) cv2.imshow("hough",image),cv2.waitKey(0) print ("rho={0:.2f}, theta={1:.0f}".format(rho, np.rad2deg(theta)))

使用霍夫變換檢測直線具體步驟:

  1. 彩色影象->灰度圖
  2. 去噪(高斯核)
  3. 邊緣提取(梯度運算元、拉普拉斯運算元、canny、sobel)
  4. 二值化(判斷此處是否為邊緣點,就看灰度值==255)
  5. 對映到霍夫空間(準備兩個容器,一個用來展示hough-space概況,一個數組hough-space用來儲存voting的值,因為投票過程往往有某個極大值超過閾值,多達幾千,不能直接用灰度圖來記錄投票資訊)
  6. 取區域性極大值,設定閾值,過濾干擾直線
  7. 繪製直線、標定角點
    houghlinesp函式用法
import cv2
import numpy as np

img = cv2.imread('text3.jpg')
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
edges = cv2.Canny(gray,50,150,apertureSize = 3)
cv2.imshow('edges',edges)
cv2.waitKey(0)
minLineLength = 100
maxLineGap = 10
lines = cv2.HoughLinesP(edges,1,np.pi/180,10,minLineLength,maxLineGap)#返回的是所有檢測到的直線,每一個元素line是一個[x1,y1,x2,y2]的list
for line in lines:
    for x1, y1, x2, y2 in line:
        cv2.line(img,(x1,y1),(x2,y2),(0,255,0),2)


cv2.imwrite('houghlines1.jpg',img)

相關推薦

變換原理實現

霍夫變換是影象處理必然接觸到的一個演算法,為了檢測出來直線和圓,橢圓之類的形狀。 比較好的教程霍夫變換原理 霍夫變換實現步驟: import cv2 import numpy as np de

變換原理

看到網上一堆講原理講得亂七八糟還抄襲的部落格,把自己看懵了……轉手一wiki發現寫得很清晰,這裡貼上來供學習。 對於直角座標系(笛卡爾座標系)平面的一條直線的斜截式: y

利用變換做直線檢測的原理OpenCV程式碼實現

說白了,以直線檢測為例,霍夫變換實際上就是把使每個畫素座標點經過變換都變成都直線特質有貢獻的統一度量(這種度量以我目前的理解與笛卡爾(極坐系)並無區別,即極半徑和極角),並對轉換後的度量進行累計(可以理解為投票),當一個波峰出現時候,說明有直線存在。如果要了解更詳細的,大

變換檢測直線原理例項

霍夫變換原理 霍夫變換(Hough Transform)是影象處理中的一種特徵提取技術,該過程在一個引數空間中通過計算累計結果的區域性最大值得到一個符合該特定形狀的集合作為霍夫變換結果。 直線可以由直角座標或極座標表示,直線可以由直角座標或極座標表示,直角座標表示直線時,

變換直線檢測houghlinesopencv的實現分析

導讀: 1. houghlines的演算法思想 2. houghlines實現需要考慮的要素 3. houghlines的opencv實現,程式碼分析 4. houghlines的效率分析,改進 1. houghlines的演算法思想 檢測直線,houghlines標準演算

Opencv——變換直線檢測原理理解

霍夫變換(Hough Transform)是影象處理中的一種特徵提取技術,它通過一種投票演算法檢測具有特定形狀的物體。該過程在一個引數空間中通過計算累計結果的區域性最大值得到一個符合該特定形狀的集合作為霍夫變換結果。霍夫變換於1962年由Paul Hough 首次提出[53],後於1972年由Richard

變換直線檢測原理理解

Radon變換則以線積分的形式把影象空間投影到ρθ空間(等同於直線的引數空間)。 直線Hough變換與Radon變換的區別在於前者是直線引數變換的離散形式,而後者則是直線引數變換的連續形式。所以Hough變換直接應用在二值影象上,而Radon變換直接應用在灰度影象上。另外,由於二值影象只需要處理前景或者背景畫

變換檢測直線--原理和Matlab實現

該部落格所需程式碼和資原始檔可以到Github中進行下載。 霍夫變換本質上是座標變換,如下圖1,左半部分表示直線的xy空間,直線方程為y=mx+cy=mx+cy=mx+c,其中斜率為m,截距為c。右半部分表示將直線從xy空間變換到mc空間,取直線在xy空間上的四

變換原理 一種引數迭代的自適應尋找最佳直線的程式碼(在條碼識別中的應用)

       霍夫變換(Hough Transform)是一種識別幾何形狀的方法!霍夫變換的基本原理是利用點與線的對偶性,將原始影象空間的給定的曲線通過曲線表達形式變為引數空間的一個點。這樣就把原始影

opencv 簡單的實現變換(改進版)

//霍夫變換 輸入單通道二值影象 檢測直線數量 void HoughLines(Mat &img,int n) { int i,j; //行列 int row = img.rows; int col = img.cols; //極徑最大值為 對角線+寬 int max_r

8.變換:線條——投票原理空間、線的極座標表示_2

目錄 投票原理 霍夫空間 線的極座標表示 投票原理 就像我之前說的,檢查每一行是不可能的,即使是一臺非常非常快的電腦。 我們要做的是讓資料告訴我們,讓資料決定線在哪裡。 因為這是民主,我們該怎麼辦?   我們要做的是投票。 因此,投票是一種通用的技術

Opencv學習---變換檢測圓的基本原理

為了方便以後檢視,將基本筆記收藏到這裡! 原博文:http://blog.csdn.net/yizhaoyanbo/article/details/59172991     其實檢測圓形和檢測直線的原理差別不大,只不過直線是在二維空間,因為y=kx+b,只有k和b兩

變換直線檢測的matlab實現

clear all; BW=imread('hough1.jpg'); BW=rgb2gray(BW); %BW=medfilt2(BW,[2 2]) thresh=[0.01,0.10]; sigma=2;%定義高斯引數 f = edge(double(BW),'canny',t

【學習opencv】實現變換(1)檢測直線

目前想對於霍夫圓檢測進行修改,想法是若能在固定圓心的橫座標的情景下去搜索圓,若要實現就需要對霍夫檢測有一定的深入瞭解。 霍夫變換原理 霍夫變換原理實則就是引數空間的轉變。 極座標轉換 首先因為直角座標系中垂直於x軸的直線不存在,即轉換用極座標表示

變換 文字圖片傾斜矯正 python實現

一、霍夫變換原理簡介 霍夫變換主要是利用圖片所在的空間和霍夫空間之間的變換,將圖片所在的直角座標系中具有形狀的曲線或直線對映到霍夫空間的一個點上形成峰值,從而將檢測任意形狀的問題轉化成了計算峰值的問題。即在圖片所在的直角座標系的一個直線,轉換到霍夫空間便成了一點

變換的圓檢測原理

Hough 變換的原理 Hough 變換的原理就是利用影象全域性特徵將邊緣畫素連線起來組成區域封閉邊界,它將影象空間轉換到引數空間,在引數空間對點進行描述,達到檢測影象邊緣的目的。該方法把所有可能落在邊緣上的點進行統計計算,根據對資料的統計結果確定屬於邊緣的程度。Hough

變換直線檢測基本原理hough,houghpeaks,houghlines

一步一步來: 1、在白紙上畫出一個直角座標系,任意給出一個點; 2、那麼,對於點(x0,y0),經過這個點的直線必定滿足y0=k*x0+b, 其中k是直線的斜率,b是直線的截距; 3、上式可以化成b=y0-k*x0,  可以看作是以-x0為斜率,以y0為截距,在k

變換(hough transform)原理

      廣義霍夫變換之所以能處理任意形狀的圖形並不是找到了可以表示任意圖形的方程(這是不可能的),而是使用表的形式描述一種圖形,把圖形邊緣點座標儲存在一張表中,那麼該圖形就確定下來了,所以其實無論是直線(其實是線段)、圓、橢圓還是其他形狀的幾何圖形,都可以使用同一方法處理,所不同的是這時候的圖形是自定義的

python+opencv實現變換檢測直線

功能: 建立一個滑動條來控制檢測直線的長度閾值,即大於該閾值的檢測出來,小於該閾值的忽略 注意:這裡用的函式是HoughLinesP而不是HoughLines,因為HoughLine

基於OpenCV實現變換

霍夫變換概述 霍夫變換(Hough Transform)是影象處理中的一種特徵提取技術,該過程在一個引數空間中通過計算累計結果的區域性最大值得到一個符合該特徵的集合作為霍夫變換的結果。 霍夫線檢測 霍夫線變換是一種尋找直線的方法,在尋找霍夫變換之前,要