From 9927e414d18cd27079bf827d8bf6e4eefdaa2e48 Mon Sep 17 00:00:00 2001 From: "Jason A. Donenfeld" Date: Sun, 13 Nov 2011 19:50:06 -0500 Subject: Slight improvement by using shift and clean up the dir structure. --- unshred.py | 33 ++++++++++++++++++++------------- 1 file changed, 20 insertions(+), 13 deletions(-) (limited to 'unshred.py') diff --git a/unshred.py b/unshred.py index ea20810..98b5fc5 100755 --- a/unshred.py +++ b/unshred.py @@ -17,11 +17,14 @@ image = Image.open(argv[1]) data = image.getdata() def pixel(x, y): - pixel = data[y * image.size[0] + x] - return pixel + return data[y * image.size[0] + x] def pixel_distance(a, b): - opacity_a = a[3] / 255 - opacity_b = b[3] / 255 + try: + opacity_a = a[3] / 255 + opacity_b = b[3] / 255 + except: + opacity_a = 1 + opacity_b = 1 a_r, a_g, a_b = (a[0] * opacity_a, a[1] * opacity_a, a[2] * opacity_a) b_r, b_g, b_b = (b[0] * opacity_b, b[1] * opacity_b, b[2] * opacity_b) return sqrt((a_r - b_r) ** 2 + (a_g - b_g) ** 2 + (a_b - b_b) ** 2) @@ -31,9 +34,9 @@ for col in xrange(0, image.size[0] - 1): for row in xrange(0, image.size[1]): columns[col] += pixel_distance(pixel(col, row), pixel(col + 1, row)) shred_width = -1 -for factor in xrange(2, image.size[0]): +for factor in xrange(2, image.size[0] / 2): if image.size[0] % factor != 0: # Poor man's factorization! R.I.P. Sieve. Sorry instagram. - continue # I'm also ignoring your guidelines about divisibility by 2. + continue last_col = 0 success = True for col in xrange(0, image.size[0], factor): @@ -55,13 +58,17 @@ if shred_width == -1: exit(-2) columns = image.size[0] / shred_width -print "The image has %d columns." % columns +print "%s image has %d columns." % (argv[1], columns) def match_score(left, right): - total = 0 + straight = 0 for i in xrange(0, image.size[1]): - total += pixel_distance(pixel((left + 1) * shred_width - 1, i), pixel(right * shred_width, i)) - return total + straight += pixel_distance(pixel((left + 1) * shred_width - 1, i), pixel(right * shred_width, i)) + shifted = 0 + offset = image.size[1] / 35 + for i in xrange(offset, image.size[1] - offset): + shifted += pixel_distance(pixel((left + 1) * shred_width - 1, i + offset), pixel(right * shred_width, i - offset)) + return straight / shifted column_matches = {} for i in xrange(0, columns): @@ -90,10 +97,10 @@ for key, value in column_matches.iteritems(): break # Otherwise, if it amazingly wraps around, let's just remove the weakest link. if last == -1: - min_score = image.size[1] * 442 # = sqrt(3) * 255 + max_score = 0 for key, value in column_matches.iteritems(): - if value[1] < min_score: - min_score = value[1] + if value[1] > max_score: + max_score = value[1] last = value[0] del column_matches[last] -- cgit v1.2.3-59-g8ed1b