如何使用Python OpenCV移除图像中的竖直线条
横竖线移除代码调整方案
你当前的代码已经内置了竖直线条的处理逻辑,未生效是参数和你的图像适配度不足,只需修改几处参数即可实现横竖线同时移除:
核心调整点
- 垂直形态学核的尺寸适配示例图的竖线长度,将
(1,50)调整为(1,30),如果你的其他图像竖线更长可适当调大第二个参数 - 放开垂直检测后的膨胀操作注释,避免短线、断线漏检
- 可根据线条粗细调整绘制轮廓的线宽,确保完全覆盖原始线条
调整后完整代码
import cv2 import matplotlib.pyplot as plt import glob import os def remove_lines(image_path,outdir): image = cv2.imread(image_path) result = image.copy() gray = cv2.cvtColor(image,cv2.COLOR_BGR2GRAY) thresh = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY_INV + cv2.THRESH_OTSU)[1] # 移除水平线 horizontal_kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (50,1)) remove_horizontal = cv2.morphologyEx(thresh, cv2.MORPH_OPEN, horizontal_kernel, iterations=2) cnts = cv2.findContours(remove_horizontal, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE) cnts = cnts[0] if len(cnts) == 2 else cnts[1] for c in cnts: cv2.drawContours(result, [c], -1, (255,255,255), 5) # 移除竖直线 vertical_kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (1,30)) # 调整核高度适配竖线长度 remove_vertical = cv2.morphologyEx(thresh, cv2.MORPH_OPEN, vertical_kernel, iterations=2) remove_vertical = cv2.dilate(remove_vertical , vertical_kernel, iterations=1) # 放开膨胀操作,避免断线 cnts = cv2.findContours(remove_vertical, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE) cnts = cnts[0] if len(cnts) == 2 else cnts[1] for c in cnts: cv2.drawContours(result, [c], -1, (255,255,255), 5) # 若竖线更粗可加大最后这个线宽参数 cv2.imwrite(os.path.join(outdir,os.path.basename(image_path)), result) plt.imshow(result) for jpgfile in glob.glob(r'C:\custom\TableDetectionWork\images/*'): print(jpgfile) remove_lines(jpgfile,r'C:\custom\TableDetectionWork\output/')
效果参考
原始图像:
已移除水平线的中间效果:
运行调整后代码即可得到同时移除横竖线的效果。
内容的提问来源于stack exchange,提问作者Hammad Younas
相关产品推荐
相关产品推荐

