Fully document PIL.ImageFilter

This commit is contained in:
Stephen Johnson 2013-10-12 16:49:32 -07:00
parent 11cd6a9150
commit a2c67dc3af
3 changed files with 114 additions and 88 deletions

View File

@ -17,31 +17,28 @@
from functools import reduce from functools import reduce
class Filter(object): class Filter(object):
pass pass
##
# Convolution filter kernel.
class Kernel(Filter): class Kernel(Filter):
"""
Create a convolution kernel. The current version only
supports 3x3 and 5x5 integer and floating point kernels.
## In the current version, kernels can only be applied to
# Create a convolution kernel. The current version only "L" and "RGB" images.
# supports 3x3 and 5x5 integer and floating point kernels.
# <p> :param size: Kernel size, given as (width, height). In the current
# In the current version, kernels can only be applied to version, this must be (3,3) or (5,5).
# "L" and "RGB" images. :param kernel: A sequence containing kernel weights.
# :param scale: Scale factor. If given, the result for each pixel is
# @def __init__(size, kernel, **options) divided by this value. the default is the sum of the
# @param size Kernel size, given as (width, height). In kernel weights.
# the current version, this must be (3,3) or (5,5). :param offset: Offset. If given, this value is added to the result,
# @param kernel A sequence containing kernel weights. after it has been divided by the scale factor.
# @param **options Optional keyword arguments. """
# @keyparam scale Scale factor. If given, the result for each
# pixel is divided by this value. The default is the sum
# of the kernel weights.
# @keyparam offset Offset. If given, this value is added to the
# result, after it has been divided by the scale factor.
def __init__(self, size, kernel, scale=None, offset=0): def __init__(self, size, kernel, scale=None, offset=0):
if scale is None: if scale is None:
@ -56,24 +53,23 @@ class Kernel(Filter):
raise ValueError("cannot filter palette images") raise ValueError("cannot filter palette images")
return image.filter(*self.filterargs) return image.filter(*self.filterargs)
class BuiltinFilter(Kernel): class BuiltinFilter(Kernel):
def __init__(self): def __init__(self):
pass pass
##
# Rank filter.
class RankFilter(Filter): class RankFilter(Filter):
name = "Rank" """
Create a rank filter. The rank filter sorts all pixels in
a window of the given size, and returns the **rank**'th value.
## :param size: The kernel size, in pixels.
# Create a rank filter. The rank filter sorts all pixels in :param rank: What pixel value to pick. Use 0 for a min filter,
# a window of the given size, and returns the rank'th value. ``size * size / 2`` for a median filter, ``size * size - 1``
# for a max filter, etc.
# @param size The kernel size, in pixels. """
# @param rank What pixel value to pick. Use 0 for a min filter, name = "Rank"
# size*size/2 for a median filter, size*size-1 for a max filter,
# etc.
def __init__(self, size, rank): def __init__(self, size, rank):
self.size = size self.size = size
@ -85,99 +81,99 @@ class RankFilter(Filter):
image = image.expand(self.size//2, self.size//2) image = image.expand(self.size//2, self.size//2)
return image.rankfilter(self.size, self.rank) return image.rankfilter(self.size, self.rank)
##
# Median filter. Picks the median pixel value in a window with the
# given size.
class MedianFilter(RankFilter): class MedianFilter(RankFilter):
name = "Median" """
Create a median filter. Picks the median pixel value in a window with the
given size.
## :param size: The kernel size, in pixels.
# Create a median filter. """
# name = "Median"
# @param size The kernel size, in pixels.
def __init__(self, size=3): def __init__(self, size=3):
self.size = size self.size = size
self.rank = size*size//2 self.rank = size*size//2
##
# Min filter. Picks the lowest pixel value in a window with the given
# size.
class MinFilter(RankFilter): class MinFilter(RankFilter):
name = "Min" """
Create a min filter. Picks the lowest pixel value in a window with the
given size.
## :param size: The kernel size, in pixels.
# Create a min filter. """
# name = "Min"
# @param size The kernel size, in pixels.
def __init__(self, size=3): def __init__(self, size=3):
self.size = size self.size = size
self.rank = 0 self.rank = 0
##
# Max filter. Picks the largest pixel value in a window with the
# given size.
class MaxFilter(RankFilter): class MaxFilter(RankFilter):
name = "Max" """
Create a max filter. Picks the largest pixel value in a window with the
given size.
## :param size: The kernel size, in pixels.
# Create a max filter. """
# name = "Max"
# @param size The kernel size, in pixels.
def __init__(self, size=3): def __init__(self, size=3):
self.size = size self.size = size
self.rank = size*size-1 self.rank = size*size-1
##
# Mode filter. Picks the most frequent pixel value in a box with the
# given size. Pixel values that occur only once or twice are ignored;
# if no pixel value occurs more than twice, the original pixel value
# is preserved.
class ModeFilter(Filter): class ModeFilter(Filter):
name = "Mode" """
## Create a mode filter. Picks the most frequent pixel value in a box with the
# Create a mode filter. given size. Pixel values that occur only once or twice are ignored; if no
# pixel value occurs more than twice, the original pixel value is preserved.
# @param size The kernel size, in pixels.
:param size: The kernel size, in pixels.
"""
name = "Mode"
def __init__(self, size=3): def __init__(self, size=3):
self.size = size self.size = size
def filter(self, image): def filter(self, image):
return image.modefilter(self.size) return image.modefilter(self.size)
##
# Gaussian blur filter.
class GaussianBlur(Filter): class GaussianBlur(Filter):
"""Gaussian blur filter.
:param radius: Blur radius.
"""
name = "GaussianBlur" name = "GaussianBlur"
def __init__(self, radius=2): def __init__(self, radius=2):
self.radius = radius self.radius = radius
def filter(self, image): def filter(self, image):
return image.gaussian_blur(self.radius) return image.gaussian_blur(self.radius)
##
# Unsharp mask filter.
class UnsharpMask(Filter): class UnsharpMask(Filter):
"""Unsharp mask filter.
See Wikipedia's entry on `digital unsharp masking`_ for an explanation of
the parameters.
.. _digital unsharp masking: https://en.wikipedia.org/wiki/Unsharp_masking#Digital_unsharp_masking
"""
name = "UnsharpMask" name = "UnsharpMask"
def __init__(self, radius=2, percent=150, threshold=3): def __init__(self, radius=2, percent=150, threshold=3):
self.radius = radius self.radius = radius
self.percent = percent self.percent = percent
self.threshold = threshold self.threshold = threshold
def filter(self, image): def filter(self, image):
return image.unsharp_mask(self.radius, self.percent, self.threshold) return image.unsharp_mask(self.radius, self.percent, self.threshold)
##
# Simple blur filter.
class BLUR(BuiltinFilter): class BLUR(BuiltinFilter):
name = "Blur" name = "Blur"
@ -189,8 +185,6 @@ class BLUR(BuiltinFilter):
1, 1, 1, 1, 1 1, 1, 1, 1, 1
) )
##
# Simple contour filter.
class CONTOUR(BuiltinFilter): class CONTOUR(BuiltinFilter):
name = "Contour" name = "Contour"
@ -200,8 +194,6 @@ class CONTOUR(BuiltinFilter):
-1, -1, -1 -1, -1, -1
) )
##
# Simple detail filter.
class DETAIL(BuiltinFilter): class DETAIL(BuiltinFilter):
name = "Detail" name = "Detail"
@ -211,8 +203,6 @@ class DETAIL(BuiltinFilter):
0, -1, 0 0, -1, 0
) )
##
# Simple edge enhancement filter.
class EDGE_ENHANCE(BuiltinFilter): class EDGE_ENHANCE(BuiltinFilter):
name = "Edge-enhance" name = "Edge-enhance"
@ -222,8 +212,6 @@ class EDGE_ENHANCE(BuiltinFilter):
-1, -1, -1 -1, -1, -1
) )
##
# Simple stronger edge enhancement filter.
class EDGE_ENHANCE_MORE(BuiltinFilter): class EDGE_ENHANCE_MORE(BuiltinFilter):
name = "Edge-enhance More" name = "Edge-enhance More"
@ -233,8 +221,6 @@ class EDGE_ENHANCE_MORE(BuiltinFilter):
-1, -1, -1 -1, -1, -1
) )
##
# Simple embossing filter.
class EMBOSS(BuiltinFilter): class EMBOSS(BuiltinFilter):
name = "Emboss" name = "Emboss"
@ -244,8 +230,6 @@ class EMBOSS(BuiltinFilter):
0, 0, 0 0, 0, 0
) )
##
# Simple edge-finding filter.
class FIND_EDGES(BuiltinFilter): class FIND_EDGES(BuiltinFilter):
name = "Find Edges" name = "Find Edges"
@ -255,8 +239,6 @@ class FIND_EDGES(BuiltinFilter):
-1, -1, -1 -1, -1, -1
) )
##
# Simple smoothing filter.
class SMOOTH(BuiltinFilter): class SMOOTH(BuiltinFilter):
name = "Smooth" name = "Smooth"
@ -266,8 +248,6 @@ class SMOOTH(BuiltinFilter):
1, 1, 1 1, 1, 1
) )
##
# Simple stronger smoothing filter.
class SMOOTH_MORE(BuiltinFilter): class SMOOTH_MORE(BuiltinFilter):
name = "Smooth More" name = "Smooth More"
@ -279,8 +259,6 @@ class SMOOTH_MORE(BuiltinFilter):
1, 1, 1, 1, 1 1, 1, 1, 1, 1
) )
##
# Simple sharpening filter.
class SHARPEN(BuiltinFilter): class SHARPEN(BuiltinFilter):
name = "Sharpen" name = "Sharpen"

View File

@ -0,0 +1,47 @@
.. py:module:: PIL.ImageFilter
.. py:currentmodule:: PIL.ImageFilter
:mod:`ImageFilter` Module
=========================
The :py:mod:`ImageFilter` module contains definitions for a pre-defined set of
filters, which can be be used with :py:meth:`Image.filter()
<PIL.Image.Image.filter>`.
Example Filter an image
-----------------------
.. code-block:: python
import ImageFilter
im1 = im.filter(ImageFilter.BLUR)
im2 = im.filter(ImageFilter.MinFilter(3))
im3 = im.filter(ImageFilter.MinFilter) # same as MinFilter(3)
Filters
-------
The current version of the library provides the following set of predefined
image enhancement filters:
* **BLUR**
* **CONTOUR**
* **DETAIL**
* **EDGE_ENHANCE**
* **EDGE_ENHANCE_MORE**
* **EMBOSS**
* **FIND_EDGES**
* **SMOOTH**
* **SMOOTH_MORE**
* **SHARPEN**
.. autoclass:: PIL.ImageFilter.GaussianBlur
.. autoclass:: PIL.ImageFilter.UnsharpMask
.. autoclass:: PIL.ImageFilter.Kernel
.. autoclass:: PIL.ImageFilter.RankFilter
.. autoclass:: PIL.ImageFilter.MedianFilter
.. autoclass:: PIL.ImageFilter.MinFilter
.. autoclass:: PIL.ImageFilter.MaxFilter
.. autoclass:: PIL.ImageFilter.ModeFilter

View File

@ -10,4 +10,5 @@ Reference
ImageDraw ImageDraw
ImageEnhance ImageEnhance
ImageFile ImageFile
ImageFilter
../PIL ../PIL