2017-02-13 5 views
2

Я натолкнулся на код ниже, где обнаружил все линии, используя обнаружение canny edge и алгоритм hough. Код ниже используется для маскировки строки, откуда мне нужно получить точки, но поскольку это изображение, я не знаю, как получить масштаб оси x и y (i, e здесь x1 = 0, x2 = 4, y1 = 0, y2 = 45), чтобы в свою очередь я мог получить точки оси x и y для этой маскированной линии. Любой подход к этому? Заранее спасибо.Получение x, y точек с изображения в python-opencv

Ниже приведен код, который я использовал.

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, но его вид х-у участка.

Edited: Это изображение образец, который я использую link

+0

так ваш вывод линии? –

+0

Результат этого кода - это линия с маской, но мне нужны x, y точки этой маскированной линии – MargS

ответ

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

EDIT:

Эй 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) 

enter image description here

EDIT:

Полный код:

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

ok, для этого вам нужно придумать функцию преобразования. Потому что на изображении начало '(0,0)' начинается с ** вверху слева ** угла изображения. В графиках он начинается с ** нижнего левого угла ** –

+0

Да. Какая функция преобразования? Это любой способ получить эти баллы? – MargS

+0

Работа на нем .....: D –

Смежные вопросы