forked from darkpaw/camrap
-
Notifications
You must be signed in to change notification settings - Fork 0
/
linedet.py
128 lines (92 loc) · 3.01 KB
/
linedet.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
# Copyright 2012 Felix Sheldon
#
# This file is part of Camrap.
#
# Camrap is free software: you can redistribute it and/or modify it
# under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# Camrap is distributed in the hope that it will be useful, but
# WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
#
# See the GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with Camrap. If not, see http://www.gnu.org/licenses/.
#
# This class handles horizontal and vertical line detection.
# Row/column pixel sum data are averaged and then used to find "peaks"
# of blackness. A parabola can be fitted to these peaks to give a
# subpixel line position.
import numpy
import Image, ImageDraw, ImageFont
import sys
if sys.platform == "win32":
from time import clock
else:
from time import time as clock
import os
import subprocess
class linedetection(object):
def __init__(self):
pass
def read(self, pixelsums, reject_edges_px):
lines = self.findpeaks(pixelsums, reject_edges_px)
return lines
def findpeaks(self, linesums, reject):
peaks = []
peak = []
prevpt = 0
size = len(linesums)
#print "find peaks", linesums[:20]
for x, pt in enumerate(linesums):
if pt > 20000.0:
#print x, pt
if x - prevpt > 10:
peaks.append(peak)
peak = []
peak.append((x,pt))
prevpt = x
#print "pk x", x
peaks.append(peak)
#print peaks
edgecleanedpeaks = []
for peak in peaks:
add = True
for line in peak:
if line[0] <= reject:
add = False
if line[0] >= (size - reject):
add = False
if add:
edgecleanedpeaks.append(peak)
peakfits = []
for pk in edgecleanedpeaks:
if len(pk) < 4:
continue
pkarr = numpy.asarray(pk)
split = numpy.hsplit(pkarr,2)
peakvals = split[1].sum(axis=1)
xvals = split[0].sum(axis=1)
#print "peak vals:", xvals
fit = numpy.polyfit(xvals, peakvals, 2)
peakfits.append((xvals,fit))
#print "peak fit:", fit
#print peakfits
lines = []
for pkfit in peakfits:
fit = pkfit[1]
#print fit
a = fit[0]
b = fit[1]
c = fit[2]
max = (- b) / (2 * a)
if(max < 0):
#print max, pkfit
#print edgecleanedpeaks
pass
else:
lines.append(max)
return lines