原始圖
完整代碼
- import cv2 as cv
- import numpy as np
- def line_detection(image):
- gray=cv.cvtColor(image,cv.COLOR_BGR2GRAY)
- cv.imshow('gray', gray)
- gray=cv.GaussianBlur(gray,(11,11),0)
- cv.imshow('gray2', gray)
- edge=cv.Canny(gray,50,150,apertureSize=3)
- cv.imshow('Canny',edge)
- cv.imwrite('canny2.png',edge)
- lines=cv.HoughLines(edge,1,np.pi/180,200)
- print(lines.shape)
- print(lines)
- 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(image,(x1,y1),(x2,y2),(0,0,255),2)
- cv.imshow('image-lines',image)
- def line_detect_possible_demo(image):
- gray=cv.cvtColor(image,cv.COLOR_BGR2GRAY)
- edge=cv.Canny(gray,50,150,apertureSize=3)
- lines=cv.HoughLinesP(edge,1,np.pi/180,100,minLineLength=50,maxLineGap=10)
- for line in lines:
- x1,y1,x2,y2=line[0]
- cv.line(image,(x1,y1),(x2,y2),(0,0,255),2)
- cv.imshow('image_detect_possible_demo',image)
- src=cv.imread('Traffic_Lanes.jpg')
- #src=cv.imread('Advanced_Sudoku.png')
- cv.imshow('input',src)
- line_detection(src)
- line_detect_possible_demo(src)
- cv.waitKey()
複製代碼
• lines代表霍夫轉換的回傳資料
• 內容為 (N,1,2)的三維結構。
• N代表幾組直線
• line[0]代表要找每一組直線的長度與角度
• rho代表長度
• theta代表角度
• a代表角度cos值
• b代表角度sin值
• x0與y0代表這條線的中位數
• x0代表x軸內容
• y0代表y軸內容
• x1與y1代表這條線的最大值
• x1代表x軸內容
• y1代表y軸內容
• x2與y2代表這條線的最小值
• x2代表x軸內容
• y2代表y軸內容
• 1000這是一個常數,亦可做調整。 • HoughLinesP 機率霍夫轉換
• 檢測圖像中分段的直線
• 共有六個參數
• 1.輸入的影像,必須是灰階影像。
• 2.rho以像素為單位的距離精度,一般會設定為1。
• 3.theta,代表偵測時角度設定,math.pi/180.0 代表探索所有可能的角度。
• 4.偵測的閥值,這個數值愈小,判定出來的直線就會愈多。
• 5.minLineLength 代表線條最短長度,比這個設定短的都會忽略。
• 6.maxLineGap 代表線條之間的最大間隔,比這個設定短的會當作一條線。• Gaussian 高斯模糊是針對整張影像進行模糊動作,降低雜訊。
• 若無法去除雜訊,接著可進行影像型態處理(黑與白),代表影像內容會做調整,Dialation或Erosion的操作。
• 1.Dialation 膨脹擴展,白色區域會變大
• 2.Erosion 腐蝕,白色區域會變小
• 3.Open,先腐蝕再膨脹,可去除小區域的孔洞
• 4.Close,先膨脹再腐蝕,將小區域孔洞做整合
• 若灰階色彩中存在非黑非白資訊,亦可用閥值方式查找後進行調整。
• 這張道路圖片 (Traffic_Lanes.bmp)可以進行多次影像形態處理,藉此消除雜訊
|