本文根据《OpenCV3计算机视觉Python语言实现第二版》,进行代码编写,感谢本书作者的辛勤付出!
直线检测
代码
import cv2
import numpy as np
#直线检测
img = cv2.imread("../image/test3.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 x1,y1,x2,y2 in lines[0]:
cv2.line(img,(x1,y1),(x2,y2),(0,255,0),2) #画出直线
cv2.imshow("edges",edges)
cv2.imshow("lines",img)
cv2.waitKey()
cv2.destroyWindow()
运行结果
使用到的函数分析
1.概率霍夫变换-cv2.HoughLinesP
# 概率霍夫变换 Probabilistic_Hough_Transform
lines =cv2.HoughLinesP(edges,1,np.pi/180,100,minLineLength,maxLineGap)
输入参数:
- 1.edges :需要处理的图像
- 2.线段的几何表示 一般取1和np.pi/180
- 3.阈值:低于该阈值的直线会被忽略。霍夫变换可以理解为投票箱和投票数之间的关系,每个投票箱代表一条直线,投票数达到阈值会被保留,其余会被删除。
- 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()
运行结果
使用到的函数分析
1.霍夫圆变换-cv2.HoughCircles
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)
输入参数:
- image:为输入图像,需要灰度图
- method:为检测方法 目前,唯一实现的方法是 CV_HOUGH_GRADIENT,基本上是 21HT
- dp:为检测内侧圆心的累加器图像的分辨率于输入图像之比的倒数,如dp=1,累加器和输入图像具有相同的分辨率,如果dp=2,累计器便有输入图像一半那么大的宽度和高度
- minDist:表示两个圆之间圆心的最小距离
- param1:有默认值100,它是method设置的检测方法的对应的参数,对当前唯一的方法霍夫梯度法cv2.HOUGH_GRADIENT,它表示传递给canny边缘检测算子的高阈值,而低阈值为高阈值的一半
- param2:有默认值100,它是method设置的检测方法的对应的参数,对当前唯一的方法霍夫梯度法cv2.HOUGH_GRADIENT,它表示在检测阶段圆心的累加器阈值,它越小,就越可以检测到更多根本不存在的圆,而它越大的话,能通过检测的圆就更加接近完美的圆形了
- minRadius:有默认值0,圆半径的最小值
- maxRadius:有默认值0,圆半径的最大值
返回值:
- 找到的圆的输出向量。每个向量被编码为3元素的浮点向量 (x,y,半径)。
[[[189.5 211.5 148.5]]]
这里输出结果只有一组代表只有一个圆
转载:https://blog.csdn.net/weixin_44746581/article/details/105929979
查看评论