python - 在 PDF 或 JPG 中定位水平线的 X&Y
问题描述
我正在尝试定位 PDF 文档中所有水平线的 X&Y。我在这里使用代码: 检测水平线的代码
这段代码很好地标记了水平线,但我无法在文档中提取它们的坐标。
这是我的代码:
def DetectLine(pageNum):
# Convert to grayscale and adaptive threshold to obtain a binary image
img = cv2.imread(outpath + 'page_' + str(pageNum) + '.jpg')
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
thresh = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY_INV + cv2.THRESH_OTSU)[1]
# Then we create a kernel and perform morphological transformations to isolate horizontal lines
horizontal_kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (15,1))
detected_lines = cv2.morphologyEx(thresh, cv2.MORPH_OPEN, horizontal_kernel, iterations=2)
# detect lines find contours and draw the result
cnts = cv2.findContours(detected_lines, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
cnts = cnts[0] if len(cnts) == 2 else cnts[1]
for c in cnts:
cv2.drawContours(img, [c], -1, (36,255,12), 3)
cv2.imshow('image_' + str(pageNum), img)
此函数获取页码并读取特定页面的预先准备好的 JPG。
我怎样才能退回 Xs & Ys?
解决方案
如果只需要要点: 您可以使用以下方法提取它:
第 1 点:c[0][0]
或cnts[num]c[0][0]
第 2 点:c[1][0]
或cnts[num]c[1][0]
其中 num 是轮廓的索引
中点 解决方案将是:
(cnts[0][1][0][0]+cnts[0][0][0][0])//2,cnts[0][0][0][1]
由于 get 的每一行或每一行都有两个点,因此您可以使用平均公式计算中间点。eg: x1=10 and x2=90, 那么中点就是(10+90)/2
这是完整的代码:
import cv2
image = cv2.imread('2.png')
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, (15,1))
detected_lines = cv2.morphologyEx(thresh, cv2.MORPH_OPEN, horizontal_kernel, iterations=2)
cnts = cv2.findContours(detected_lines, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
cnts = cnts[0] if len(cnts) == 2 else cnts[1]
for c in cnts:
x,y=(c[1][0][0]+c[0][0][0])//2,c[0][0][1]
print(f'The middle point is: x: {x}, y: {y}')
cv2.drawContours(image, [c], -1, (36,255,12), 3)
cv2.circle(image, (x,y), radius=5, color=(0, 0, 255), thickness=-1)
cv2.imshow('thresh', thresh)
cv2.imshow('detected_lines', detected_lines)
cv2.imshow('image', image)
cv2.waitKey()
推荐阅读
- php - 如何在时间类型输入框中显示 db 值?
- typescript - 将 useState 钩子与 TypeScript 一起使用
- c++ - 为 iOS 14.5 arm64 编译时 C++ stdlib 中的编译错误
- javascript - 如何使用 django 模板以特定顺序呈现 django 模型实例?
- html - 我怎样才能得到这样的网格?
- css - 在 React 中添加和删除类
- javascript - 使用 While 循环和 Do While 循环打印数字列表
- iis - Crypto SystemKeys 文件夹越来越失控
- java - 按过去 3 天排序数组列表
- javascript - 添加浮点数时不满足循环停止条件的Javascript