diff options
Diffstat (limited to 'bin')
-rw-r--r-- | bin/__init__.py | 0 | ||||
-rw-r--r-- | bin/box_blur.py | 38 | ||||
-rw-r--r-- | bin/gaussian_blur.py | 44 | ||||
-rw-r--r-- | bin/shift.py | 52 | ||||
-rw-r--r-- | bin/utils/__init__.py | 0 | ||||
-rw-r--r-- | bin/utils/cmd_line.py | 15 | ||||
-rw-r--r-- | bin/utils/image.py | 16 |
7 files changed, 165 insertions, 0 deletions
diff --git a/bin/__init__.py b/bin/__init__.py new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/bin/__init__.py diff --git a/bin/box_blur.py b/bin/box_blur.py new file mode 100644 index 0000000..9d5d1cd --- /dev/null +++ b/bin/box_blur.py @@ -0,0 +1,38 @@ +# Copyright 2016 (c) Egor Tensin <Egor.Tensin@gmail.com> +# This file is part of the "Simple image filters" project. +# For details, see https://github.com/egor-tensin/filters. +# Distributed under the MIT License. + +import argparse +import sys + +from .utils import cmd_line, image +from filters.convolution import convolve +from filters.kernel.box_blur import gen_kernel + +DEFAULT_RADIUS = 1 + +def _main_box_blur(img_path, radius=DEFAULT_RADIUS, output_path=None): + img = image.load_grayscale(img_path) + kernel = gen_kernel(radius) + output = convolve(img, kernel) + if output_path is None: + image.show(output) + else: + image.save(output_path, output) + +def _parse_args(args=sys.argv): + parser = argparse.ArgumentParser() + parser.add_argument('img_path') + parser.add_argument('--output', '-o', + dest='output_path', default=None) + parser.add_argument('--radius', '-r', + type=cmd_line.parse_non_negative_integer, + default=DEFAULT_RADIUS) + return parser.parse_args(args[1:]) + +def _main(args=sys.argv): + _main_box_blur(**vars(_parse_args(args))) + +if __name__ == '__main__': + _main() diff --git a/bin/gaussian_blur.py b/bin/gaussian_blur.py new file mode 100644 index 0000000..d530547 --- /dev/null +++ b/bin/gaussian_blur.py @@ -0,0 +1,44 @@ +# Copyright 2016 (c) Egor Tensin <Egor.Tensin@gmail.com> +# This file is part of the "Simple image filters" project. +# For details, see https://github.com/egor-tensin/filters. +# Distributed under the MIT License. + +import argparse +import sys + +from .utils import cmd_line, image +from filters.convolution import convolve +from filters.kernel.gaussian_blur import gen_kernel + +DEFAULT_SIGMA = 1. +DEFAULT_RADIUS = 1 + +def _main_gaussian_blur( + img_path, radius=DEFAULT_RADIUS, sigma=DEFAULT_SIGMA, + output_path=None): + + img = image.load_grayscale(img_path) + kernel = gen_kernel(radius, sigma) + output = convolve(img, kernel) + if output_path is None: + image.show(output) + else: + image.save(output_path, output) + +def _parse_args(args=sys.argv): + parser = argparse.ArgumentParser() + parser.add_argument('img_path') + parser.add_argument('--output', '-o', + dest='output_path', default=None) + parser.add_argument('--sigma', '-s', + type=float, default=DEFAULT_SIGMA) + parser.add_argument('--radius', '-r', + type=cmd_line.parse_non_negative_integer, + default=DEFAULT_RADIUS) + return parser.parse_args(args[1:]) + +def _main(args=sys.argv): + _main_gaussian_blur(**vars(_parse_args(args))) + +if __name__ == '__main__': + _main() diff --git a/bin/shift.py b/bin/shift.py new file mode 100644 index 0000000..8dfd76a --- /dev/null +++ b/bin/shift.py @@ -0,0 +1,52 @@ +# Copyright 2016 (c) Egor Tensin <Egor.Tensin@gmail.com> +# This file is part of the "Simple image filters" project. +# For details, see https://github.com/egor-tensin/filters. +# Distributed under the MIT License. + +import argparse +import sys + +from .utils import cmd_line, image +from filters.convolution import convolve +from filters.kernel.shift import Direction + +DEFAULT_DIRECTION = Direction.SOUTH_EAST +DEFAULT_DISTANCE = 1 + +def _main_shift( + img_path, direction=DEFAULT_DIRECTION, distance=DEFAULT_DISTANCE, + output_path=None): + + img = image.load_grayscale(img_path) + kernel = direction.gen_kernel(distance) + output = convolve(img, kernel) + if output_path is None: + image.show(output) + else: + image.save(output_path, output) + +def _parse_direction(s): + try: + return Direction(s) + except ValueError: + raise argparse.ArgumentTypeError('invalid direction: ' + s) + +def _parse_args(args=sys.argv): + parser = argparse.ArgumentParser() + parser.add_argument('img_path') + parser.add_argument('--output', '-o', + dest='output_path', default=None) + parser.add_argument('--direction', '-d', + type=_parse_direction, + choices=Direction, + default=DEFAULT_DIRECTION) + parser.add_argument('--distance', '-n', + type=cmd_line.parse_non_negative_integer, + default=DEFAULT_DISTANCE) + return parser.parse_args(args[1:]) + +def _main(args=sys.argv): + _main_shift(**vars(_parse_args(args))) + +if __name__ == '__main__': + _main() diff --git a/bin/utils/__init__.py b/bin/utils/__init__.py new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/bin/utils/__init__.py diff --git a/bin/utils/cmd_line.py b/bin/utils/cmd_line.py new file mode 100644 index 0000000..6bfeafe --- /dev/null +++ b/bin/utils/cmd_line.py @@ -0,0 +1,15 @@ +# Copyright 2016 (c) Egor Tensin <Egor.Tensin@gmail.com> +# This file is part of the "Simple image filters" project. +# For details, see https://github.com/egor-tensin/filters. +# Distributed under the MIT License. + +import argparse + +def parse_non_negative_integer(s): + try: + x = int(s) + except ValueError: + raise argparse.ArgumentTypeError('must be a non-negative integer: ' + s) + if x < 0: + raise argparse.ArgumentTypeError('must be a non-negative integer: ' + s) + return x diff --git a/bin/utils/image.py b/bin/utils/image.py new file mode 100644 index 0000000..1dd64cd --- /dev/null +++ b/bin/utils/image.py @@ -0,0 +1,16 @@ +# Copyright 2016 (c) Egor Tensin <Egor.Tensin@gmail.com> +# This file is part of the "Simple image filters" project. +# For details, see https://github.com/egor-tensin/filters. +# Distributed under the MIT License. + +import cv2 + +def load_grayscale(path): + return cv2.imread(path, cv2.IMREAD_GRAYSCALE) + +def save(path, img): + cv2.imwrite(path, img) + +def show(img, window_title=None): + cv2.imshow(window_title, img) + cv2.waitKey() |