Skip to content

Instantly share code, notes, and snippets.

@vgarvardt
Forked from bobuk/img.py
Last active December 11, 2015 02:29
Show Gist options
  • Save vgarvardt/4531127 to your computer and use it in GitHub Desktop.
Save vgarvardt/4531127 to your computer and use it in GitHub Desktop.
#!/usr/bin/env python
# -*- coding: utf-8 -*-
#
# Video of original screencast: https://vimeo.com/57296525
#
# Modified by Vladimir Garvardt
#
from __future__ import print_function
import os
import random
from PIL import Image as pImage
import numpy
class Image:
"""Take an information from image file"""
BLOCK_SIZE = 20
TRESHOLD = 60
MAX_DISTANCE = 220
def __init__(self, filename):
self.filename = filename
self.checked = False
self.load()
def load(self):
img = pImage.open(self.filename)
img = img.resize((Image.BLOCK_SIZE, Image.BLOCK_SIZE), pImage.BILINEAR)
self.t_data = numpy.array(map(sum, img.getdata()))
def similar(self, other):
if self.checked: return None
if self == other: return -1
dist = sum(1 for x in self.t_data - other.t_data if abs(x) > Image.TRESHOLD)
return None if dist > Image.MAX_DISTANCE else dist
def __repr__(self):
return self.filename
def __eq__(self, obj):
return self.filename == obj.filename
def get_images_list(dirname):
files = (f for f in os.listdir(dirname) if f.lower().endswith('.jpg'))
files = (os.path.join(dirname, f) for f in files)
images = [Image(f) for f in files]
random.shuffle(images)
return images
def find_similar(images):
similar = []
for img in images:
lookin = filter(lambda x: not x.checked, [x for x in images])
distances = filter(lambda d: d[0] is not None, [(img.similar(x), x) for x in lookin])
if len(distances) > 1: similar.append(distances)
img.checked = True
return similar
def htmlize_similar(similar):
res = '<html><body>\n'
for distances in similar:
for dist, img in distances:
res += '<img src="%s" width="200"> %s\n' % (os.path.basename(img.filename), dist if dist > -1 else '-')
res += '<hr/>\n'
res += '</body></html>'
return res
if __name__ == '__main__':
images = get_images_list('./') # './,~/Pictures'
similar = find_similar(images)
print(htmlize_similar(similar))
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment