opencv - 如何将垂直线的表格图像拆分为三个图像?
问题描述
我想将垂直线上的表格图像拆分为三个图像,如下所示。是否可以?每列的宽度是可变的。可悲的是,如您所见,左侧垂直线是从标题向下绘制的。
- 输入图像 (input.png)
- 输出图像 (output1.png)
- 输出图像 (output2.png)
- 输出图像 (output3.png)
更新 1
可悲的是,如您所见,左侧垂直线是从标题向下绘制的。
这意味着我猜下面的图像 B 更容易分割。但我的情况是A。
更新 2
我正在尝试按照@HansHirse 给我的方式去做。我的期望是 sub_image_1.png、sub_image_2.png 和 sub_image_3.png 存储在 out 文件夹中。但到目前为止还没有运气。我正在调查它。
https://github.com/zono/ocr/blob/16fd0ec9a2c7d2e26279ec53947fe7fbab9f526d/src/opencv.py
$ git clone https://github.com/zono/ocr.git
$ cd ocr
$ git checkout 16fd0ec9a2c7d2e26279ec53947fe7fbab9f526d
$ docker-compose up -d
$ docker exec -it ocr /bin/bash
$ python3 opencv.py
解决方案
由于您的表格完全对齐,您可以反转图像的二进制阈值,并沿 y 轴计数(白色)像素以检测垂直线:
您需要清理山峰,因为较粗的线条可能会出现高原。
这就是我在 Python OpenCV 中的想法:
import cv2
import numpy as np
from skimage import io # Only needed for web reading images
# Web read image via scikit-image; convert to OpenCV's BGR color ordering
img = cv2.cvtColor(io.imread('https://i.stack.imgur.com/BTqBs.png'), cv2.COLOR_RGB2BGR)
# Inverse binary threshold grayscale version of image
img_thr = cv2.threshold(cv2.cvtColor(img, cv2.COLOR_BGR2GRAY), 128, 255, cv2.THRESH_BINARY_INV)[1]
# Count pixels along the y-axis, find peaks
thr_y = 200
y_sum = np.count_nonzero(img_thr, axis=0)
peaks = np.where(y_sum > thr_y)[0]
# Clean peaks
thr_x = 50
temp = np.diff(peaks).squeeze()
idx = np.where(temp > thr_x)[0]
peaks = np.concatenate(([0], peaks[idx+1]), axis=0) + 1
# Save sub-images
for i in np.arange(peaks.shape[0] - 1):
cv2.imwrite('sub_image_' + str(i) + '.png', img[:, peaks[i]:peaks[i+1]])
我得到以下三个图像:
如您所见,如果实际线条只有 1 像素宽,您可能希望将选择修改 +/- 1 像素。
希望有帮助!
----------------------------------------
System information
----------------------------------------
Platform: Windows-10-10.0.16299-SP0
Python: 3.8.1
NumPy: 1.18.1
OpenCV: 4.2.0
----------------------------------------
推荐阅读
- javascript - 是否有 javascript 命令来推迟视频?
- ansible - 在 Anible 中使用计数器控制循环
- git - 合并具有相似分支签名的分支
- javascript - 显示选定的图像、网页
- mysql - SQL 获取今天更新的所有元组的查询是什么(在 CollectionDate 列中以 DD-MMM-YY 格式提供的日期)?
- javascript - 未设置 JQuery 验证
- jenkins - Jenkins 上的 EFS 恢复需要很多小时
- scala - 使用 HLists 的映射不会编译
- python - 如何在多处理程序中提取包
- css - 如何使文本和背景图像(“封面”不完全有帮助)遵循浏览器的大小?