如何解决在 PDF 或 JPG 中定位水平线的 X&Y
我正在尝试定位 PDF 文档中所有水平线的 X&Y。 我在这里使用代码: code to detect horizontal lines
此代码很好地标记了水平线,但我无法在文档中提取它们的坐标。
这是我的代码:
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,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,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的每一行或countour都有两个点,你可以用平均公式计算中间点。 例如: x1=10 且 x2=90,则中点为 (10+90)/2
完整代码如下:
import cv2
image = cv2.imread('2.png')
gray = cv2.cvtColor(image,cv2.COLOR_BGR2GRAY)
thresh = cv2.threshold(gray,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,12),3)
cv2.circle(image,(x,y),radius=5,color=(0,255),thickness=-1)
cv2.imshow('thresh',thresh)
cv2.imshow('detected_lines',detected_lines)
cv2.imshow('image',image)
cv2.waitKey()
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。