我有下面的图像:
注意,上面的图像只是一个例子,我需要一个解决方案,将工作在每一个图像,我的图像可以有不同的大小,更多的空单元格或更少的空单元格,等等(我会尝试总是删除网格线之前,我会在这里找到的解决方案,但仍然)。
我试着在上面画出水平和垂直的图像。
水平功能:
def getHorizontalCnt(old_image):
# read image
img = old_image.copy() # cv2.imread(image_path1)
hh, ww = img.shape[:2]
# convert to grayscale
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# average gray image to one row
row = cv2.resize(gray, (1,hh), interpolation = cv2.INTER_AREA)
# threshold on white
thresh = cv2.threshold(row, 240, 255, cv2.THRESH_BINARY_INV)[1]
plt.imshow(thresh)
# get contours
contours = cv2.findContours(thresh, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
contours = contours[0] if len(contours) == 2 else contours[1]
return contours, ww
垂直功能:
def getVerticalCnt(old_image):
# read image
img = old_image.copy() # cv2.imread(image_path1)
hh, ww = img.shape[:2]
# convert to grayscale
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# average gray image to one column
column = cv2.resize(gray, (ww, 1), interpolation = cv2.INTER_AREA)
# threshold on white
thresh = cv2.threshold(column, 254, 255, cv2.THRESH_BINARY)[1]
# get contours
contours = cv2.findContours(thresh, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
contours = contours[0] if len(contours) == 2 else contours[1]
return contours, hh
应用它们:
original_image = cv2.imread(image_path)
# Horizontal lines
contours_h, ww_ = getHorizontalCnt(original_image.copy())
# Vertical lines
contours_v, hh_ = getVerticalCnt(original_image.copy())
# Draw horizontal
for cntr in contours_h:
x, y, w, h = cv2.boundingRect(cntr)
ycenter = y + h //2
cv2.line(original_image, (0, ycenter), (ww_ - 1, ycenter), (0, 0, 0), 1)
# Draw vertical
for cntr in contours_v:
x, y, w, h = cv2.boundingRect(cntr)
xcenter = x + w // 2
cv2.line(original_image, (xcenter, 0), (xcenter, hh_ - 1), (0, 0, 0), 1)
plt.imshow(original_image)
结果:
如果将# Draw horizontal
区域从ycenter = y + h //2
更改为ycenter = y + h + 2
,则会得到以下结果:
在这两个函数中,我尝试了从240到255的阈值,每次都是1比1地提高和降低,但没有一个对我有效(有时我得到了不同的结果,但仍然不是一个好的结果,以上是我到目前为止得到的最好的结果)。
更新,额外背景图像:
输入:
输出:
2条答案
按热度按时间lndjwyie1#
下面的代码在Python/OpenCV中的表格上绘制线条。
输入:
阈值图像:
行线图像:
列线图像:
行线和列线图像:
57hvy0tb2#
我试过了,但可能需要为输入图像调整一些阈值...
(The代码是C++,但我认为您可以从注解中了解它的作用。)
这是结果:
并且该结果是从90度旋转的输入图像获得的:
(The通过简单地组合这些,可以获得完整的结果。)