python - 如何使用 Python openCV 仅在这张表格的图像中找到左上角框的位置(x、y、宽度、高度)?
问题描述
我有这张图片,我只需要找到左上角框的位置以及它的宽度和高度。如何在 openCV 中使用 Python 做到这一点?在此处输入图像描述
解决方案
这是在 Python/OpenCV/Numpy 中执行此操作的一种方法。
- 读取输入
- 转换为灰色
- 二进制阈值
- 计算每行和每列中黑色像素的总和
- 将总和阈值设置为图像高度和宽度的 80% 以上的计数
- 查找这些总和中具有非零值的所有坐标
- 过滤坐标以删除彼此相距 10 像素以内的任何值,以避免重复超过 1 像素的线条
- 获取过滤后坐标的第一个和第二个坐标作为左上角矩形的边界
- 在这些边界处裁剪输入图像
- 保存结果
输入:
import cv2
import numpy as np
# read input
img = cv2.imread("table_cells.png")
hh, ww = img.shape[:2]
# convert to gray
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
# threshold to binary
thresh = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY)[1]
# get sum of black values in rows and columns
row_sums = np.sum(thresh==0, axis=1)
column_sums = np.sum(thresh==0, axis=0)
# threshold sums to counts above 80% of hh and ww
row_sums[np.where(row_sums<0.8*ww)] = 0
column_sums[np.where(column_sums<0.8*hh)] = 0
# find coordinates that have non-zero values
row_coords = np.argwhere(row_sums>0)
column_coords = np.argwhere(column_sums>0)
num_rows = len(row_coords)
num_cols = len(column_coords)
# filter row_coords to avoid duplicates within 10 pixels
row_coords_filt = [row_coords[0]]
for i in range(num_rows-1):
if (row_coords[i] > row_coords[i-1]+10):
row_coords_filt.append(row_coords[i])
column_coords_filt = [column_coords[0]]
for i in range(num_cols-1):
if (column_coords[i] > column_coords[i-1]+10):
column_coords_filt.append(column_coords[i])
# print row_coords_filt
print('grid row coordinates:')
for c in row_coords_filt:
print (c)
print('')
# print column_coords_filt
print('grid column coordinates:')
for c in column_coords_filt:
print (c)
# get left, right, top, bottom of upper left rectangle
left = int(column_coords_filt[0])
right = int(column_coords_filt[1])
top = int(row_coords_filt[0])
bottom = int(row_coords_filt[1])
# crop rectangle
rectangle = img[top:bottom, left:right]
# save output
cv2.imwrite('table_cells_crop.png', rectangle)
cv2.imshow('thresh', thresh)
cv2.imshow('rectangle', rectangle)
cv2.waitKey(0)
cv2.destroyAllWindows()
裁剪矩形:
找到的坐标:
grid row coordinates:
[30]
[315]
[599]
[884]
grid column coordinates:
[41]
[790]
[1540]
[2289]
推荐阅读
- c# - 等到应用程序获得 SpotifyAPI-Net 5.1.1 的授权
- python - Python / Google Drive API - orderBy'name'和orderBy'name_natural'有什么区别?
- c# - 如何在 Windows 窗体 C# 中切换可见性
- php - woocommerce 报告仅过滤已完成的订单
- codemirror - file_put_content 在文件中添加空行
- javascript - 如何在 webdriverio 中获取表格特定元素的文本?
- python - 具有有效数据的最后一个单元格
- c# - 当我不想修改一个属性时,它不起作用,ef core的问题
- python - Python 字典的内存高效 Hashmap 替代方案(整数到整数)
- c - 使用 C 中的可变长度消息更新无锁缓冲区