You need to enable JavaScript to run this app. Python OpenCV在无网格图像上绘制行列分隔竖线失败问题求助
优惠活动
大模型
产品
解决方案
定价
更多

Python OpenCV在无网格图像上绘制行列分隔竖线失败问题求助

我有如下所示的图像:
输入图像

我需要在图像的行列之间添加垂直和水平分隔线,参考已有代码已经成功添加了水平分隔线,但添加垂直分隔线时出错,麻烦大家帮忙指出我的代码存在什么问题?

import cv2
import numpy as np
import matplotlib.pyplot as plt
file = r"C:/Users/gaojia/Dropbox/Projects/Parking_lot/Community_Group_Buying/scripts/test_2.png"
# 读取图像
img = cv2.imread(file)
hh, ww = img.shape[:2]

# 转换为灰度图
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)

# 灰度图二值化
thresh = cv2.threshold(gray, 254, 255, cv2.THRESH_BINARY)[1]

# 统计每一列非零像素的数量
count = np.count_nonzero(thresh, axis=0)

# 按图像高度对统计结果做二值化
count_thresh = count.copy()
count_thresh[count==hh] = 255
count_thresh[count<hh] = 0
count_thresh = count_thresh.astype(np.uint8)

# 提取轮廓
contours = cv2.findContours(count_thresh, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
contours = contours[0] if len(contours) == 2 else contours[1]

# 遍历轮廓获取边界框,计算x轴中点并绘制垂直线
result = img.copy()
for cntr in contours:
    x,y,w,h = cv2.boundingRect(cntr)
    xcenter = x+w//2
    cv2.line(result, (xcenter,0), (xcenter, hh-1), (0, 0, 0), 2)

# 展示结果
cv2.imshow("THRESHOLD", thresh)
cv2.imshow("RESULT", result)
cv2.waitKey(0)

上述代码仅能在图像最左侧绘制一条垂直竖线,我将原图中自带的竖线移除后运行,结果依然没有变化。


编辑补充

根据第一条回答的提示,我意识到findContours()的输入不能为一维数组,因此我将如下代码段:

# 统计每一列非零像素的数量
count = np.count_nonzero(thresh, axis=0)

# 按图像高度对统计结果做二值化
count_thresh = count.copy()
count_thresh[count==hh] = 255
count_thresh[count<hh] = 0
count_thresh = count_thresh.astype(np.uint8)

替换为:

# 查找存在0值的行索引
row_zero = np.nonzero(np.any(thresh == 0, axis=1))[0]
# 将存在0值的行所有像素设为0
thresh[row_zero, :] =  0

修改后成功在文本列之间添加了垂直分隔线。


内容的提问来源于stack exchange,提问作者Jia Gao

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.10 12:18:01