这是一种方法:
- 将图像转换为灰度
- 阈值处理以获取二值图像
- 进行形态学操作以连接轮廓并平滑图像
- 查找线条
将图像转换为灰度后,我们对其进行阈值处理以获得二进制图像。
![](https://istack.dev59.com/3U1fl.webp)
import cv2
import numpy as np
image = cv2.imread('1.png')
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
thresh = cv2.threshold(gray, 0, 255,cv2.THRESH_BINARY_INV + cv2.THRESH_OTSU)[1]
接下来,我们执行
形态学操作来连接轮廓。
![](https://istack.dev59.com/w9dNa.webp)
kernel = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (9,9))
close = cv2.morphologyEx(thresh, cv2.MORPH_CLOSE, kernel, iterations=3)
最后,我们使用
cv2.HoughLinesP()
找到了这条线。
![](https://istack.dev59.com/wOkMK.webp)
minLineLength = 550
maxLineGap = 70
lines = cv2.HoughLinesP(close,1,np.pi/180,100,minLineLength,maxLineGap)
for line in lines:
for x1,y1,x2,y2 in line:
cv2.line(image,(x1,y1),(x2,y2),(36,255,12),3)
不使用
cv2.HoughLinesP()
的替代方法是找到轮廓并使用
cv2.contourArea()
进行过滤。最大的轮廓将成为我们的线条。
完整代码
import cv2
import numpy as np
image = cv2.imread('1.png')
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
thresh = cv2.threshold(gray, 0, 255,cv2.THRESH_BINARY_INV + cv2.THRESH_OTSU)[1]
kernel = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (9,9))
close = cv2.morphologyEx(thresh, cv2.MORPH_CLOSE, kernel, iterations=3)
minLineLength = 550
maxLineGap = 70
lines = cv2.HoughLinesP(close,1,np.pi/180,100,minLineLength,maxLineGap)
for line in lines:
for x1,y1,x2,y2 in line:
cv2.line(image,(x1,y1),(x2,y2),(36,255,12),3)
cv2.imshow('thresh', thresh)
cv2.imshow('close', close)
cv2.imshow('image', image)
cv2.waitKey()