提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
文章目录
- 前言
- 一、简介
- 二,算法实现:
- 2.1 中值滤波去噪
- 2.2滤波图像取反并提取直线
- 2.3 二值图细化
- 2.4 对细化后的直线进行霍夫变换
前言
在当今计算机视觉领域,直线提取作为图像处理的一项基本任务,广泛应用于工业检测、道路识别、建筑测量等多个场景。然而,在实际应用中,复杂多变的背景往往给直线提取带来了极大挑战。本文将围绕OpenCV这一强大的计算机视觉库,探讨如何在复杂背景下实现高效的直线提取。
一、简介
本次提取直线的图片为下图:
如图所示,图片中充满复杂的椒盐噪声实现直线提取所需的流程为图像去噪,清除图像噪点,霍夫直线拟合提取图像中的直线,形态学细化提取直线骨架,再次拟合提取出干净的直线。
二,算法实现:
2.1 中值滤波去噪
代码如下:
img = cv2.imread('test.png')
cv2.imshow('src', img)
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
blur = cv2.medianBlur(gray, 3)
cv2.imshow('blur',blur)
2.2滤波图像取反并提取直线
滤波图像取反,然后使用HoughLinesP(累计概率霍夫变换)检测直线。图像取反原因是HoughLinesP是在黑色背景中找白色直线,这样效果更好,并将检测到的所有直线绘制在图像上,让直线特征更加密集。
blur = cv2.bitwise_not(blur)
cv2.imshow('bitwise_not',blur)
cv2.waitKey(0)temp = np.zeros(blur.shape, np.uint8)
# Detect and draw lines
lines = cv2.HoughLinesP(blur, 1, np.pi/180, 10, minLineLength=50, maxLineGap=30)for line in lines:for x1, y1, x2, y2 in line:cv2.line(temp, (x1, y1), (x2, y2), (255, 255, 255), 2)
二值化取反后的图像:
绘制后的图像:
2.3 二值图细化
temp[temp==255] = 1
skeleton = morphology.skeletonize(temp)
thin = skeleton.astype(np.uint8)*255
cv2.imshow("thin",thin)
效果:
2.4 对细化后的直线进行霍夫变换
lines = cv2.HoughLinesP(thin, 1, np.pi/180, 20, minLineLength=50, maxLineGap=30)
print(len(lines)) for line in lines:for x1, y1, x2, y2 in line:cv2.line(img, (x1, y1), (x2, y2), (0, 0, 255), 2)
最终效果: