问题描述
我遇到了下面的代码,它使用canny边缘检测和霍夫算法检测所有行。 下面的代码用于掩盖我需要从哪里获取点的线,但由于这是图像,我不知道如何获得x和y轴刻度(i,e这里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图,但它是一种xy图。
已编辑:这是使用的示例图像
1楼
你已经在这行代码中拥有它们:
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颜色空间,然后提取饱和通道。 然后我应用Hough线变换来获得所需的线
码:
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)
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()