import cv2
import numpy as np
#直线检测
img = cv2.imread("../image/test2.jpg") #读取照片
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY) #图像二值画
edges = cv2.Canny(gray,50,120) #获取图像边缘
minLineLength =20
maxLineGap =5
# 概率霍夫变换 Probabilistic_Hough_Transform
lines =cv2.HoughLinesP(edges,1,np.pi/180,100,minLineLength,maxLineGap)
for line in lines: #遍历所有直线
for x1,y1,x2,y2 in line: #其中一条直线
cv2.line(img,(x1,y1),(x2,y2),(0,255,0),2) #画出直线
print(lines)
cv2.imshow("edges",edges)
cv2.imshow("lines",img)
cv2.waitKey()
cv2.destroyWindow()
# 概率霍夫变换 Probabilistic_Hough_Transform
lines =cv2.HoughLinesP(edges,1,np.pi/180,100,minLineLength,maxLineGap)
输入参数:
返回值:
说明:
仅仅是一条直线都需要两个参数,这需要大量的计算。 Probabilistic_Hough_Transform 是对霍夫变换的一种优化。它不会对每一个点都进行计算,而是从一幅图像中随机选取一个点集进行计算,对于直线检测来说这已经足够了。但是使用这种变换我们必须要降低阈值
import cv2
import numpy as np
planets = cv2.imread("../image/test3.jpg")
gray_img = cv2.cvtColor(planets,cv2.COLOR_BGR2GRAY)
img = cv2.medianBlur(gray_img,5)
cimg = cv2.cvtColor(img,cv2.COLOR_GRAY2BGR)
circles = cv2.HoughCircles(img,cv2.HOUGH_GRADIENT,1,120,param1=100,param2=30,minRadius=0,maxRadius=0)
circles = np.uint16(np.around(circles)) #近似函数
for i in circles[0,:]:
#画外部圆
cv2.circle(planets,(i[0],i[1]),i[2],(0,255,0),2)
#画圆的中心
cv2.circle(planets,(i[0],i[1]),2,(0,0,255),3)
# cv2.imwrite("planets_circles.jpg",planets)
cv2.imshow("HoughCirlces",planets)
cv2.waitKey()
cv2.destroyWindow()
circles=cv2.HoughCircles
(img,cv2.HOUGH_GRADIENT,1,120,param1=100,param2=30,minRadius=0,maxRadius=0)
#示例
cv2.HoughCircles(image, method, dp, minDist, circles, param1, param2, minRadius, maxRadius)
输入参数:
返回值:
[[[189.5 211.5 148.5]]]
这里输出结果只有一组代表只有一个圆