在Python-OpenCV中从图像获取x、y点

4
我发现以下代码,它使用Canny边缘检测和霍夫算法来检测所有的线。下面的代码用于从其中一个线中获取点的位置,但由于这是一张图片,我不知道如何获取x轴和y轴的比例尺(例如,在这里x1=0,x2=4,y1=0,y2=45),以便我可以获取该掩蔽线的x和y轴点。有什么方法可以做到这一点吗?先谢谢了。
以下是我使用的代码:
import numpy as np
import cv2

img = cv2.imread('linearline.png', 1) 
hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
lower_range = np.array([18, 100, 100], dtype=np.uint8)
upper_range = np.array([38, 255, 255], dtype=np.uint8)
mask = cv2.inRange(hsv, lower_range, upper_range)
edges = cv2.Canny(mask,50,150,apertureSize = 3)
cv2.imshow('edgesimage',edges)


print img.shape[1]
print img.shape
minLineLength=img.shape[1]-300
lines = cv2.HoughLinesP(image=edges,rho=0.02,theta=np.pi/500,
threshold=10,lines=np.array([]),minLineLength=minLineLength,maxLineGap=100)


a,b,c = lines.shape
for i in range(a):
cv2.line(img, (lines[i][0][0], lines[i][0][1]), (lines[i][0][2],       
lines[i][0][3]), (0, 0, 255), 3, cv2.LINE_AA)

cv2.imshow('result', img)
cv2.waitKey(0)
cv2.destroyAllWindows()

我无法上传我的linearline.png图表,但它是一种x-y坐标系图。

编辑:这是我使用的示例图片 链接


你的输出是一行吗? - Jeru Luke
这段代码的输出是一个掩码线,但我需要该掩码线的x、y坐标点。 - MargS
1个回答

2

你已经在这行代码中拥有它们:

cv2.line(img, (lines[i][0][0], lines[i][0][1]), (lines[i][0][2], lines[i][0][3]), (0, 0, 255), 3, cv2.LINE_AA)

要获取第一个坐标,只需打印出:
print lines[i][0][0] 
print lines[i][0][1]  

要获取第二个坐标,您需要打印:

print lines[i][0][2] 
print lines[i][0][3]

为了知道 lines 包含什么内容,请键入 print lines编辑: 嘿,MargS,我实际上误解了你的要求。要明确提到你想要的,首先必须提取图表中的文本,然后识别使预期答案过于宽泛的地方。
但是,我能够使用不同的方法识别出您需要的行。
我将图像转换为HSV颜色空间,然后提取饱和度通道。然后应用霍夫线变换以获得所需的线。
代码:
hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
h, s, v = cv2.split(hsv)
ret,th = cv2.threshold(s,127,255, 0)
cv2.imshow('th.jpg', th)

enter image description here

lines = cv2.HoughLinesP(th,1,np.pi/180,100,minLineLength=100,maxLineGap=10)
for line in lines:
    x1,y1,x2,y2 = line[0]
    cv2.line(img,(x1,y1),(x2,y2),(0,255,0),2)

cv2.imshow('houghlines5.jpg',img)

这里输入图片描述

编辑:

完整代码:

import cv2
import numpy as np

filename = 'line.jpg'
img = cv2.imread(filename)
cv2.imshow('img.jpg',img)
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
cv2.imshow('gray.jpg',gray)

hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
cv2.imshow('hsv.jpg', hsv)

h, s, v = cv2.split(hsv)
ret,th = cv2.threshold(s,127,255, 0)
cv2.imshow('th.jpg', th)

lines = cv2.HoughLinesP(th,1,np.pi/180,100,minLineLength=100,maxLineGap=10)
for line in lines:
    x1,y1,x2,y2 = line[0]
    cv2.line(img,(x1,y1),(x2,y2),(0,255,0),2)

cv2.imshow(HoughLines.jpg',img)

cv2.waitKey(0)
cv2.destroyAllWindows()

为了解决这个问题,您需要编写一个转换函数。因为在图像中,原点(0,0)位于图像的左上角。而在图表中,它位于左下角。 - Jeru Luke
是的。什么转换函数?有没有办法获取这些点? - MargS
@MargS 抱歉让你等待了...也很遗憾不能达到你的期望。实际上我误解了你的需求。希望我能以其他方式帮助你 :D - Jeru Luke
请问你能解释一下为什么要使用 ret,th = cv2.threshold(s,127,255, 0) 这行代码吗?它的意思是什么? - MargS
我将图像从RGB颜色空间转换为HSV颜色空间。 我获取了S通道(饱和度)。 然后进行了阈值处理,任何像素<127->黑色,像素>=127->白色。 - Jeru Luke
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接