Created
February 24, 2011 20:51
-
-
Save t0ster/842858 to your computer and use it in GitHub Desktop.
This file contains 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 characters
import sys | |
import argparse | |
import Image | |
import ImageFilter | |
from numpy import exp, mgrid | |
def resize(args): | |
image = Image.open(args.image) | |
new_size = [s * args.n for s in image.size] | |
image = image.resize(new_size) | |
image.save(generate_new_filename(args.image, 'resized'), 'JPEG') | |
def gaus_filter(args): | |
image = Image.open(args.image) | |
image = image.filter(GAUSSIAN) | |
image.save(generate_new_filename(args.image, 'gauss'), 'JPEG') | |
def gaussian_grid(size=5): | |
""" | |
Create a square grid of integers of gaussian shape | |
e.g. gaussian_grid() returns | |
array([[ 1, 4, 7, 4, 1], | |
[ 4, 20, 33, 20, 4], | |
[ 7, 33, 55, 33, 7], | |
[ 4, 20, 33, 20, 4], | |
[ 1, 4, 7, 4, 1]]) | |
""" | |
m = size / 2 | |
n = m + 1 # remember python is 'upto' n in the range below | |
x, y = mgrid[-m:n, -m:n] | |
# multiply by a factor to get 1 in the corner of the grid | |
# ie for a 5x5 grid fac*exp(-0.5*(2**2 + 2**2)) = 1 | |
fac = exp(m ** 2) | |
g = fac * exp(-0.5 * (x ** 2 + y ** 2)) | |
return g.round().astype(int) | |
class GAUSSIAN(ImageFilter.BuiltinFilter): | |
name = "Gaussian" | |
gg = gaussian_grid().flatten().tolist() | |
filterargs = (5, 5), sum(gg), 0, tuple(gg) | |
def generate_new_filename(path, word): | |
part1, part2 = path.split('.') | |
return '%s_%s.%s' % (part1, word, part2) | |
def get_parser(): | |
parser = argparse.ArgumentParser( | |
epilog="Example usage:\n python %s gauss image.jpg\n" | |
" python %s resize 3 image.jpg" % (sys.argv[0], sys.argv[0]), | |
formatter_class=argparse.RawDescriptionHelpFormatter | |
) | |
subparsers = parser.add_subparsers() | |
parser_res = subparsers.add_parser('resize', help='enlarges imges n times') | |
parser_res.add_argument('n', type=int, help='resizing coefficient') | |
parser_res.add_argument('image', type=str, help='path to jpg image file') | |
parser_res.set_defaults(func=resize) | |
parser_filt = subparsers.add_parser('gauss', help='gaussian filter') | |
parser_filt.add_argument('image', type=str, help='path to jpg image file') | |
parser_filt.set_defaults(func=gaus_filter) | |
return parser | |
def main(): | |
args = get_parser().parse_args() | |
args.func(args) | |
if __name__ == '__main__': | |
main() |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment