1
0
mirror of https://github.com/undera/pylgbst.git synced 2020-11-18 19:37:26 -08:00

Basic tracing works

This commit is contained in:
Andrey Pohilko 2017-10-01 10:46:13 +03:00
parent 6302a2b92d
commit 90ea11148b

View File

@ -1,5 +1,6 @@
import logging
import matplotlib.pyplot as plt
import time
from threading import Thread
import numpy
@ -9,21 +10,42 @@ from PIL import Image
class Tracer(object):
def __init__(self, fname):
super(Tracer, self).__init__()
self.threshold = 64
self.orig = Image.open(fname)
self.conv1 = self.orig.convert("1")
self.conv1 = self.remove_transparency(self.orig)
self.conv1 = self.conv1.convert("L")
self.src = numpy.asarray(self.conv1)
self.dst = numpy.copy(self.src)
self.dst.fill(False)
self.mark = numpy.copy(self.dst)
# start in center
self.height, self.width = self.dst.shape
self.height, self.width = self.dst.shape[0:2]
self.posy = self.height / 2
self.posx = self.width / 2
def remove_transparency(self, im, bg_colour=(255, 255, 255)):
# from https://stackoverflow.com/questions/35859140/remove-transparency-alpha-from-any-image-using-pil
# Only process if image has transparency (http://stackoverflow.com/a/1963146)
if im.mode in ('RGBA', 'LA') or (im.mode == 'P' and 'transparency' in im.info):
# Need to convert to RGBA if LA format due to a bug in PIL (http://stackoverflow.com/a/1963146)
alpha = im.convert('RGBA').split()[-1]
# Create a new background image of our matt color.
# Must be RGBA because paste requires both images have the same format
# (http://stackoverflow.com/a/8720632 and http://stackoverflow.com/a/9459208)
bg = Image.new("RGBA", im.size, bg_colour + (255,))
bg.paste(im, mask=alpha)
return bg
else:
return im
def trace(self):
while self._has_unchecked_pixels():
# go circles to find a pixel in src
self._spiral_till_pixel()
if not self._spiral_till_pixel():
break
# move until we find new pixels
self._move_while_you_can()
@ -40,8 +62,8 @@ class Tracer(object):
in_lower = self.posy < self.height and self.posx < self.width
in_upper = self.posy >= 0 and self.posx >= 0
if in_lower and in_upper and not self.mark[self.posy][self.posx]:
if self.src[self.posy][self.posx]:
return
if self.src[self.posy][self.posx] < self.threshold:
return True
self.mark[self.posy][self.posx] = True
@ -71,10 +93,12 @@ class Tracer(object):
if direction in (0, 2):
radius += 1
raise KeyboardInterrupt("End of image") # end of image
logging.debug("End of image")
return False
def _move_while_you_can(self):
logging.debug("%s %s", self.posy, self.posx)
# time.sleep(0.1)
logging.debug("%s:%s=%s", self.posy, self.posx, self.src[self.posy][self.posx])
self.mark[self.posy][self.posx] = True
self.dst[self.posy][self.posx] = True
# self.posx += 1
@ -109,6 +133,7 @@ class TracerVisualizer(object):
if __name__ == "__main__":
logging.basicConfig(level=logging.DEBUG)
trc = Tracer("/tmp/truck.png")
trc = Tracer("test1.png")
TracerVisualizer(trc).run()
time.sleep(5)