我有下面的图像:
我想这样提取方框图:
以下是我的尝试:
import cv2
import matplotlib.pyplot as plt
# Load the image
image = cv2.imread('diagram.jpg')
# Convert to grayscale
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
# Apply thresholding to create a binary image
_, thresh = cv2.threshold(gray, 127, 255, cv2.THRESH_BINARY_INV)
# Find contours
contours, hierarchy = cv2.findContours(thresh, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
# Draw the contours
cv2.drawContours(image, contours, -1, (0, 0, 255), 2)
# Show the final image
plt.imshow(image), plt.show()
然而,我意识到提取图表会很困难,因为轮廓不是闭合的:
我尝试过使用形态学闭合来闭合长方体边缘的间隙:
# Define a rectangular kernel for morphological closing
kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (5, 5))
# Perform morphological closing to close the gaps in the box edges
closed = cv2.morphologyEx(thresh, cv2.MORPH_CLOSE, kernel)
但这几乎改变不了什么。我应该如何处理这个问题呢?
2条答案
按热度按时间cx6n0qe31#
我们可以用扩张然后侵 eclipse 来代替形态闭合,但是**填充扩张和侵 eclipse 之间的轮廓。
为了填补空白,内核大小应该比5x5大得多(我使用了51x51)。
假设手写框是彩色的,我们可以从BGR转换为HSV,并在HSV的饱和度通道上应用阈值:
应用大核扩张,并使用
drawContours
填充轮廓:填充轮廓后应用侵 eclipse 扩张后侵 eclipse 等同于闭合,但这里我们是填充后闭合。
代码示例:
结果:
gray
(饱和通道):thresh
:dilated
(灌装后):closed
:m1m5dgzv2#
只需要扩大图像以使矩形闭合,然后定义轮廓面积的阈值:
您将获得: