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. --- TokyoPanoramaShredded.png | Bin 617432 -> 0 bytes grafitroniks-shred.png | Bin 0 -> 546357 bytes paris-shred.png | Bin 0 -> 1021152 bytes paris-shred2.png | Bin 0 -> 1018654 bytes reshredded.png | Bin 617339 -> 0 bytes run.sh | 7 +++++++ tokyo-shred.png | Bin 0 -> 617432 bytes tokyo-shred2.png | Bin 0 -> 617367 bytes unshred-binary-merge-failure.py | 12 ++++++++---- unshred.py | 33 ++++++++++++++++++++------------- 10 files changed, 35 insertions(+), 17 deletions(-) delete mode 100644 TokyoPanoramaShredded.png create mode 100644 grafitroniks-shred.png create mode 100644 paris-shred.png create mode 100644 paris-shred2.png delete mode 100644 reshredded.png create mode 100755 run.sh create mode 100644 tokyo-shred.png create mode 100644 tokyo-shred2.png diff --git a/TokyoPanoramaShredded.png b/TokyoPanoramaShredded.png deleted file mode 100644 index be74187..0000000 Binary files a/TokyoPanoramaShredded.png and /dev/null differ diff --git a/grafitroniks-shred.png b/grafitroniks-shred.png new file mode 100644 index 0000000..4373a33 Binary files /dev/null and b/grafitroniks-shred.png differ diff --git a/paris-shred.png b/paris-shred.png new file mode 100644 index 0000000..58cdfe2 Binary files /dev/null and b/paris-shred.png differ diff --git a/paris-shred2.png b/paris-shred2.png new file mode 100644 index 0000000..3c204d1 Binary files /dev/null and b/paris-shred2.png differ diff --git a/reshredded.png b/reshredded.png deleted file mode 100644 index ec1e05f..0000000 Binary files a/reshredded.png and /dev/null differ diff --git a/run.sh b/run.sh new file mode 100755 index 0000000..8d2ec91 --- /dev/null +++ b/run.sh @@ -0,0 +1,7 @@ +#!/bin/sh +mkdir test +for i in *.png; do + ./unshred.py "$i" "test/$i-unshred.png" +done +gwenview *.png test/*.png 2>/dev/null +rm -rf test \ No newline at end of file diff --git a/tokyo-shred.png b/tokyo-shred.png new file mode 100644 index 0000000..be74187 Binary files /dev/null and b/tokyo-shred.png differ diff --git a/tokyo-shred2.png b/tokyo-shred2.png new file mode 100644 index 0000000..282f400 Binary files /dev/null and b/tokyo-shred2.png differ diff --git a/unshred-binary-merge-failure.py b/unshred-binary-merge-failure.py index abb19c5..b8dc3c8 100755 --- a/unshred-binary-merge-failure.py +++ b/unshred-binary-merge-failure.py @@ -1,6 +1,6 @@ #!/usr/bin/env python -# Instagram Unshredder -- Binary Simplify Failure +# Instagram Unshredder - Binary Simplifier # by Jason A. Donenfeld # for http://instagram-engineering.tumblr.com/post/12651721845/instagram-engineering-challenge-the-unshredder @@ -29,10 +29,14 @@ def pixel_distance(a, b): def match_score(left, right): left = left[len(left) - 1] right = right[0] - 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 def binary_simplify(order_lists): simplified = list() blacklist = list() 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