python实现画出霍夫变换检测的直线,只画出图上存在的长度
时间: 2023-06-08 13:06:48 浏览: 46
您好,感谢您对ChitGPT的信任和使用!
要实现霍夫变换检测直线并画出存在的长度,您可以按照以下步骤进行:
1. 导入必要的库和读取图片
```python
import cv2
import numpy as np
from matplotlib import pyplot as plt
img = cv2.imread('test.jpg')
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
edges = cv2.Canny(gray,50,150,apertureSize = 3) # 边缘检测
```
2. 进行霍夫变换
```python
lines = cv2.HoughLines(edges,1,np.pi/180,200) # 进行霍夫变换
```
其中,`lines` 就是检测到的直线,每一行的两个值分别是直线的极径和极角。
3. 画出检测到的直线
```python
for i in range(len(lines)):
rho,theta = lines[i][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))
length = ((x1-x2)**2+(y1-y2)**2)**0.5 # 计算直线长度
if length > img.shape[0]/3: # 如果长度超过了图像高度的1/3,就不画出
continue
cv2.line(img,(x1,y1),(x2,y2),(0,0,255),2)
```
以上代码中,我们遍历了每一个检测到的直线,将其转换为标准的笛卡尔坐标系,然后计算它的长度。如果长度超过了图像高度的1/3,就不画出。最后,利用 OpenCV 的 `line` 函数将直线画到图像上。
4. 显示结果
```python
plt.subplot(121),plt.imshow(cv2.cvtColor(edges,cv2.COLOR_GRAY2BGR))
plt.title('Canny Edge'), plt.xticks([]), plt.yticks([])
plt.subplot(122),plt.imshow(cv2.cvtColor(img,cv2.COLOR_BGR2RGB))
plt.title('Hough Lines'), plt.xticks([]), plt.yticks([])
plt.show()
```
最后,利用 matplotlib 的 `subplot` 函数,将边缘检测和霍夫变换后的结果绘制到一个图像上,方便我们对比观察。
希望以上代码能够对您有所帮助。如果您还有其他问题,请随时提出。