2017-02-13 9 views
2

Ich stieß auf Code, wo er alle Zeilen erkennt mit Hilfe von Canny Kantenerkennung und Hough-Algorithmus. Der folgende Code wird verwendet, um die Linie zu maskieren, von wo ich die Punkte abholen muss, aber da dies ein Bild ist, weiß ich nicht, wie man die x- und y-Achsenskalierung erhält (i, e hier x1 = 0, x2 = 4, y1 = 0, y2 = 45), damit ich wiederum die x- und y-Achsenpunkte für diese maskierte Linie erhalten kann. Irgendein Ansatz, um das zu tun? Danke im Voraus.Getting x, y Punkte aus dem Bild in Python-opencv

Unten ist der Code, den ich verwendet habe.

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() 

Ich kann nicht der Lage, meinen linearline.png Graph hochladen, aber es ist eine Art von x-y-Plot.

Edited: Dies ist das Musterbild, die link

+0

also ist Ihre Ausgabe eine Zeile? –

+0

Die Ausgabe dieses Codes ist eine maskierte Zeile, aber ich brauche x, y Punkte dieser maskierten Zeile – MargS

Antwort

2

Sie bereits haben sie in dieser Zeile Code verwenden:

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) 

Um die zunächst nur auf Druck koordinieren:

print lines[i][0][0] 
print lines[i][0][1] 

, um die zweite zu druckende Koordinate zu erhalten:

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

Um zu wissen, was linesprint lines

Editiertyp enthält:

Hey margs, habe ich eigentlich falsch verstanden, was Sie wollten. Um explizit zu erwähnen, was Sie wollten, müssen Sie zuerst den Text in der Grafik extrahieren und dann die Punkte identifizieren, die die erwartete Antwort übermäßig breit machen.

Ich konnte jedoch die Linie, die Sie benötigten, mit einem anderen Ansatz identifizieren.

Ich konvertierte das Bild in HSV-Farbraum und extrahierte dann den Sättigungskanal. Ich bewarb mich dann Hough Linie verwandeln die gewünschte Zeile

Code zu erhalten:

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:

komplette Code:

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 für das müssen Sie mit einer Transformationsfunktion kommen. Denn im Bild beginnt der Ursprung '(0,0)' an der ** oberen linken ** Ecke des Bildes. In Graphen beginnt es an der ** unteren linken Ecke ** –

+0

Ja. Welche Transformationsfunktion? Ist das ein Weg, um diese Punkte zu bekommen? – MargS

+0

Arbeiten daran .....: D –

Verwandte Themen