Last active
August 21, 2024 21:23
-
-
Save scottrogowski/c3c474a04d7c0cd8ddeb to your computer and use it in GitHub Desktop.
Revisions
-
scottrogowski revised this gist
Jul 15, 2015 . 1 changed file with 1 addition and 0 deletions.There are no files selected for viewing
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters. Learn more about bidirectional Unicode charactersOriginal file line number Diff line number Diff line change @@ -1,6 +1,7 @@ #!/usr/bin/env python # This script will pixelate most jpg and png images # It will both show you the result and save it import sys -
scottrogowski created this gist
Jul 15, 2015 .There are no files selected for viewing
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters. Learn more about bidirectional Unicode charactersOriginal file line number Diff line number Diff line change @@ -0,0 +1,84 @@ #!/usr/bin/env python # This script will pixelate most jpg and png images import sys import matplotlib.pyplot as plt import numpy as np import PIL.Image as Image import scipy.misc as misc def load_img(filename): # boilerplate code to open an image and make it editable img = Image.open(filename) data = np.array(img) return data def all_square_pixels(row, col, square_h, square_w): # Every pixel for a single "square" (superpixel) # Note that different squares might have different dimensions in order to # not have extra pixels at the edge not in a square. Hence: int(round()) for y in xrange(int(round(row*square_h)), int(round((row+1)*square_h))): for x in xrange(int(round(col*square_w)), int(round((col+1)*square_w))): yield y, x def make_one_square(img, row, col, square_h, square_w): # Sets all the pixels in img for the square given by (row, col) to that # square's average color pixels = [] # get all pixels for y, x in all_square_pixels(row, col, square_h, square_w): pixels.append(img[y][x]) # get the average color av_r = 0 av_g = 0 av_b = 0 for r, g, b in pixels: av_r += r av_g += g av_b += b av_r /= len(pixels) av_g /= len(pixels) av_b /= len(pixels) # set all pixels to that average color for y, x in all_square_pixels(row, col, square_h, square_w): img[y][x] = (av_r, av_g, av_b) if __name__ == "__main__": try: filename = sys.argv[1] except IndexError: filename = raw_input("Image to pixelate? ") img = load_img(filename) # Figure out the dimensions of each square # We want: # 1. Square width and height should be about the same # 2. No leftover pixels at the edges # This means that some squares might have one more or one less pixel # depending on rounding num_cols = int(raw_input("How many squares from left to right? ")) square_w = float(img.shape[1]) / num_cols num_rows = int(round(img.shape[0] / square_w)) square_h = float(img.shape[0]) / num_rows # overwrite each square with the average color, one by one for row in range(num_rows): for col in range(num_cols): make_one_square(img, row, col, square_h, square_w) # show the image plt.axis('off') plt.imshow(img) plt.show() # save the image filename_parts = filename.rsplit('.', 1) filename_parts[0] += '_pixelated' filename = '.'.join(filename_parts) print "Saving as", filename misc.imsave(filename, img)