diff options
author | Jason A. Donenfeld <Jason@zx2c4.com> | 2011-11-13 19:50:06 -0500 |
---|---|---|
committer | Jason A. Donenfeld <Jason@zx2c4.com> | 2011-11-14 00:08:27 -0500 |
commit | 9927e414d18cd27079bf827d8bf6e4eefdaa2e48 (patch) | |
tree | 57fe8216f51d5874c3954168c3e7a20b75ca294f /unshred.py | |
parent | Initial commit. (diff) | |
download | instagram-unshredder-9927e414d18cd27079bf827d8bf6e4eefdaa2e48.tar.xz instagram-unshredder-9927e414d18cd27079bf827d8bf6e4eefdaa2e48.zip |
Slight improvement by using shift and clean up the dir structure.
Diffstat (limited to 'unshred.py')
-rwxr-xr-x | unshred.py | 33 |
1 files changed, 20 insertions, 13 deletions
@@ -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] |