我正在尝试检测P&ID中的方形符号(一个图表)图像文件。我尝试了使用轮廓的教程,但这种方法似乎不适用于这样的图表图像。使用霍夫线,我能够标记这些正方形的垂直边缘,但我不知道如何使用这些边缘检测正方形。图像中的所有正方形都有相同的尺寸,但不同图像的尺寸可能不一样,因此模板匹配对我不起作用。
我的代码使用霍夫线:
import cv2 as cv
import numpy as np
import math
img = cv.imread('test_img.jpg')
img_gray = cv.cvtColor(img, cv.COLOR_BGR2GRAY)
img_display = img.copy()
ret,thresh = cv.threshold(img_gray,250,255,cv.THRESH_BINARY)
image_inverted = cv.bitwise_not(thresh)
linesP = cv.HoughLinesP(image_inverted, 1, np.pi / 1, 50, None, 50, 2)
if linesP is not None:
for i in range(0, len(linesP)):
l = linesP[i][0]
length = math.sqrt((l[2] - l[0])**2 + (l[3] - l[1])**2)
if length < 100:
cv.line(img_display, (l[0], l[1]), (l[2], l[3]), (0,0,255), 1, cv.LINE_AA)
cv.imwrite('img_display.png', img_display)
输入图像:
输出图像:
在上面的代码中,我将它设置为只检测垂直线,因为它不能可靠地检测水平线。
1条答案
按热度按时间ql3eal8s1#
如果你知道线条是水平的还是垂直的,你可以通过组合腐 eclipse 和膨胀来过滤它们(docs描述了它的工作原理)。
在分离水平线和垂直线之后,你可以根据大小过滤它们。最后你可以填充所有剩余的闭合轮廓,然后再次使用腐 eclipse /删除来提取更大的形状。
这比使用Hough线变换更可靠,并且可以更好地控制提取的确切内容。
下面是一个演示:
输出量: