def a(self, img, otherImage): if img.mode != otherImage.mode or img.size != otherImage.size: LOG.warning("Image mode or size not matching") return None new = Image.new(img.mode, img.size) w, h = new.size for x in range(0, w): for y in range(0, h): value = img.getpixel((x, y)) otherValue = otherImage.getpixel((x, y)) newValue = value + otherValue new.putpixel((x, y), newValue) return new
def add(self, img, otherImage): if img.mode != otherImage.mode or img.size != otherImage.size: LOG.warning("Image mode or size not matching") return None new = Image.new(img.mode, img.size) w, h = new.size for x in range(0, w): for y in range(0, h): value = img.getpixel((x, y)) otherValue = otherImage.getpixel((x, y)) newValue = [0] * len(value) for i in range(0, len(value)): newValue[i] = value[i] + otherValue[i] new.putpixel((x, y), tuple(newValue)) return new
def multiply(self, rgb, mask): if rgb.size != mask.size: LOG.warning("Image mode or size not matching") return None new = Image.new(rgb.mode, rgb.size) m = mask.convert("L") w, h = new.size for x in range(0, w): for y in range(0, h): value = rgb.getpixel((x, y)) if not isinstance(value, tuple): value = (value, ) value = tuple( int(i * (m.getpixel((x, y)) / 255.0)) for i in value) new.putpixel((x, y), value) return new
def save(self, image): """VERY HACKY, ONLY USE TO DEBUG!""" LOG.warning("Using hacky save function for lazy debugging.") try: os.mkdir( os.path.join(Vars.REALPATH, "image_testing", format(self.prefix))) except Exception as e: pass frame = inspect.currentframe() name = "image" for k, v in frame.f_back.f_locals.iteritems(): if v is image: name = k break image.save( os.path.join(Vars.REALPATH, "image_testing", format(self.prefix), name + ".png"))
def processSample(self, images): if len(images) != 2: LOG.warning("Wrong number of samples. Maybe you have too little?") return Image.new("RGBA", self.size) sample1 = images[0] s1_creator = CircleCreator([sample1], None, prefix=self.prefix) sample2 = images[1] s2_creator = CircleCreator([sample2], None, prefix=self.prefix) sample1 = s1_creator.createTexture() sample2 = s2_creator.createTexture() random = Image.open(os.path.join(Vars.REALPATH, "random.png")) rand_invert = Image.open( os.path.join(Vars.REALPATH, "random_invert.png")) s_w, s_h = sample1.size t1 = ImageChops.multiply(sample1, random.convert("RGBA")) t2 = ImageChops.multiply(sample2, rand_invert.convert("RGBA")) self.texture = ImageChops.add(t1, t2) return self.texture
def createNewItemWithTextures(back1, back2): LOG.enabled = False clothing = ClothingItem() LOG.debug("Created new clothing item: {0}".format(clothing.id)) img1 = Image.open(back1) img2 = Image.open(back2) LOG.debug("Opened images.") clothing.addImage(img1, "back1") clothing.addImage(img2, "back2") LOG.debug("Added images.") clothing.createFinalTexture() LOG.enabled = True return clothing.id
def newWithTexturesFromCWD(cat): #Hack so this function can be called from any thread tempDB = Vars.DB Vars.DB = DatabaseInterface.Database() clothing = ClothingItem(category=cat) LOG.debug("Created new clothing item: {0}".format(clothing.id)) img1 = Image.open("back1.png") img2 = Image.open("back2.png") LOG.debug("Opened images.") clothing.addImage(img1, "back1") clothing.addImage(img2, "back2") LOG.debug("Added images.") clothing.createFinalTexture() Vars.DB = tempDB return clothing.id
def testingRecognizer(clothes): template = TemplateRecgonizer() match = template.findMatch("recog.png", clothes) LOG.debug("Found Match with ID: {0}, confidence: {1}".format( match[1].id, match[0]))
def createTexture(self): if len(self.samples) == 0: LOG.warning("Not enough samples") return Image.new("RGBA", self.size) self.texture = Image.new("RGBA", self.size) count = 0 images = [] for sample in self.samples: img = None if isinstance(sample, Image.Image): img = sample else: img = Image.open(sample) count += 1 images.append(img) if count >= self.num_per_processing: count = 0 self.processSample(images) images = [] if self.printed_texture: prnt = Image.open(self.printed_texture) prnt = prnt.crop( (33, 22, 523, 534)).transpose(Image.FLIP_LEFT_RIGHT) new = Image.new("RGB", (512, 512)) new.paste(prnt, (11, 0)) new.save("print_tmp.png") sample = self.samples[0] s_img = Image.open(sample) img1 = cv2.imread("print_tmp.png") img2 = cv2.imread(sample) bright = self.brightness_alt(s_img.convert("RGB")) is_white = False print(bright) if bright > 255 / 2: is_white = True if is_white: result = cv2.subtract(img2, img1) else: result = cv2.subtract(img1, img2) cv2.imwrite("print_tmp.png", result) prnt = Image.open("print_tmp.png") prnt = ImageEnhance.Contrast(prnt).enhance(1.5) if is_white: prnt = ImageOps.invert(prnt) prnt = ImageEnhance.Brightness(prnt).enhance(1.25) else: prnt = ImageEnhance.Brightness(prnt).enhance(1.75) prnt.save("print_tmp.png") prnt.save("aaa.png") result = cv2.imread("print_tmp.png") img_bw = 255 * (cv2.cvtColor(result, cv2.COLOR_BGR2GRAY) > 5).astype('uint8') se1 = cv2.getStructuringElement(cv2.MORPH_RECT, (10, 10)) se2 = cv2.getStructuringElement(cv2.MORPH_RECT, (5, 5)) mask = cv2.morphologyEx(img_bw, cv2.MORPH_CLOSE, se1) mask = cv2.morphologyEx(mask, cv2.MORPH_OPEN, se2) mask = np.dstack([mask, mask, mask]) / 255 out = result * mask cv2.imwrite("print_tmp.png", out) prnt = Image.open("print_tmp.png") self.save(prnt) prnt = prnt.convert("RGBA") w, h = prnt.size for y in range(0, h): for x in range(0, w): r, g, b, a = prnt.getpixel((int(x), int(y))) comb = (r + g + b) / 3.0 if comb < 10 and not is_white: prnt.putpixel((int(x), int(y)), (0, 0, 0, 0)) if comb > 245 and is_white: prnt.putpixel((int(x), int(y)), (0, 0, 0, 0)) self.save(prnt) prnt = prnt.resize((460, 460), Image.ANTIALIAS).crop( (11, 0, 523, 534)) self.texture.paste(prnt, (self.size[0] / 4, 110), mask=prnt.split()[3]) asdf = self.texture self.save(asdf) return self.texture
def func_wrapper(*args, **kwargs): current_time = time.time() ret = func(*args, **kwargs) LOG.debug("Time taken to execute function {0}: {1} s".format( str(func.__name__), float(time.time() - current_time))) return ret