projekty
/
imago.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
fix bug in ransac
[imago.git]
/
src
/
ransac.py
diff --git
a/src/ransac.py
b/src/ransac.py
index
4f0d9a0
..
4908421
100644
(file)
--- a/
src/ransac.py
+++ b/
src/ransac.py
@@
-7,7
+7,6
@@
import numpy as NP
# TODO comments
# TODO threshold
# TODO comments
# TODO threshold
-
def points_to_line((x1, y1), (x2, y2)):
return (y2 - y1, x1 - x2, x2 * y1 - x1 * y2)
def points_to_line((x1, y1), (x2, y2)):
return (y2 - y1, x1 - x2, x2 * y1 - x1 * y2)
@@
-37,26
+36,40
@@
class Linear_model:
def initial(self):
return random.sample(self.data, 2)
def initial(self):
return random.sample(self.data, 2)
+ def score(self, est, dist):
+ cons = []
+ score = 0
+ a, b, c = est
+ dst = lambda (x, y): abs(a * x + b * y + c) / sqrt(a*a+b*b)
+ for p in self.data:
+ d = dst(p)
+ if d <= dist:
+ cons.append(p)
+ score += min(d, dist)
+ return score, cons
+
def iterate(model, distance):
def iterate(model, distance):
- consensus = 0
+ score = float("inf")
consensual = model.initial()
consensual = model.initial()
- while (len(consensual) > consensus):
- consensus = len(consensual)
+ estimate = model.get(consensual)
+ new_score, consensual = model.score(estimate, distance)
+ while (new_score < score):
+ score = new_score
try:
estimate = model.get(consensual)
try:
estimate = model.get(consensual)
+ new_score, consensual = model.score(estimate, distance)
except NP.linalg.LinAlgError:
pass
except NP.linalg.LinAlgError:
pass
- consensual = filter_near(model.data, estimate, distance)
- return consensus, estimate, consensual
+ return score, estimate, consensual
def estimate(data, dist, k, modelClass=Linear_model):
model = modelClass(data)
def estimate(data, dist, k, modelClass=Linear_model):
model = modelClass(data)
- best =
0
+ best =
float("inf")
estimate = None
consensual = None
for i in xrange(0, k):
new, new_estimate, new_consensual = iterate(model, dist)
estimate = None
consensual = None
for i in xrange(0, k):
new, new_estimate, new_consensual = iterate(model, dist)
- if new
>
best:
+ if new
<
best:
best = new
estimate = new_estimate
consensual = new_consensual
best = new
estimate = new_estimate
consensual = new_consensual