X-Git-Url: http://git.tomasm.cz/imago.git/blobdiff_plain/ecc0929cb0e011db2825e79d7495d7ef7b113e1e..8d0a81039d4ba02531b3aa57c99093ce1098818e:/imago_pack/filters.py diff --git a/imago_pack/filters.py b/imago_pack/filters.py index c53b6e8..50a9a01 100644 --- a/imago_pack/filters.py +++ b/imago_pack/filters.py @@ -1,15 +1,52 @@ +"""Image filters module. + +All filters return a filtered copy of the image, the original image is +preserved. +""" + from PIL import Image, ImageFilter import pcf +def color_enhance(image): + """Stretch all color channels to their full range.""" + image_l = image.load() + min_r, min_g, min_b = 999, 999, 999 + max_r, max_g, max_b = -1, -1, -1 + + for x in xrange(image.size[0]): + for y in xrange(image.size[1]): + min_r = min(min_r, image_l[x, y][0]) + max_r = max(max_r, image_l[x, y][0]) + min_g = min(min_g, image_l[x, y][1]) + max_g = max(max_g, image_l[x, y][1]) + min_b = min(min_b, image_l[x, y][2]) + max_b = max(max_b, image_l[x, y][2]) + + new_image = Image.new('RGB', image.size) + new_image_l = new_image.load() + for x in xrange(image.size[0]): + for y in xrange(image.size[1]): + r, g, b = image_l[x, y] + r = (r - min_r) * 255 / (max_r - min_r) + g = (g - min_g) * 255 / (max_g - min_g) + b = (b - min_b) * 255 / (max_b - min_b) + new_image_l[x, y] = (r, g, b) + # print min_r, max_r, r, g, b + + return new_image + def edge_detection(image): - image = image.filter(ImageFilter.GaussianBlur()) + """Edge detection (on BW images).""" + new_image = image.filter(ImageFilter.GaussianBlur()) # GaussianBlur is undocumented class, it might not work in future versions # of PIL - image = Image.fromstring('L', image.size, pcf.edge(image.size, image.tostring())) - return image + new_image = Image.fromstring('L', image.size, + pcf.edge(image.size, image.tostring())) + return new_image def peaks(image): + """Peak filter (on BW images).""" image_l = image.load() new_image = Image.new('L', image.size) new_image_l = new_image.load() @@ -29,6 +66,7 @@ def peaks(image): return new_image def high_pass(image, height): + """High pass filter (on BW images).""" image_l = image.load() new_image = Image.new('L', image.size) new_image_l = new_image.load() @@ -42,6 +80,8 @@ def high_pass(image, height): return new_image +# TODO factor these into one method +# TODO comment it def components(image): image_l = image.load() new_image = Image.new('L', image.size) @@ -91,7 +131,6 @@ def components(image): c += 1 new_image_l[int(round(float(x_c)/c)), int(round(float(y_c)/c))] = 255 - return new_image def components2(image): @@ -147,5 +186,4 @@ def components2(image): c += 1 new_image_l[int(round(float(x_c)/c)), int(round(float(y_c)/c))] = 255 - return new_image