VMware ESXi and vSphere Cluster Management
Using Image Filters in Pillow
Learn how to apply Pillow image filters such as blur, sharpen, emboss, and edge detection, and convert color images to grayscale with Python.
Pillow is a Python imaging library for opening, editing, converting, displaying, and saving image files. Its import namespace is called PIL. Pillow provides image-processing operations through the PIL.ImageFilter module.
An image filter is a transformation that changes pixel values to create an effect. Filters can soften detail, sharpen edges, detect outlines, enhance contours, or create an embossed appearance. A filter is applied to an already opened Pillow Image object.
Import Image and ImageFilter
The Image module is commonly used to open and save files. The ImageFilter module contains predefined filter objects.
from PIL import Image, ImageFilter
img = Image.open('input.jpg')
These imports have different responsibilities:
Imageprovides operations such asopen(),save(), andconvert().ImageFilterprovides built-in filters such asBLURandFIND_EDGES.
Apply a Filter with Image.filter()
Call the image method filter() and pass it a filter object:
from PIL import Image, ImageFilter
img = Image.open('input.jpg')
blurred_image = img.filter(ImageFilter.BLUR)
filter() returns a new image. It does not normally replace the pixels in img. Assigning the result to a separate variable preserves the original image and makes it possible to compare both versions.
show() previews an image using an available image viewer. For a durable result, use save() and provide a different output filename.
Common Built-in Pillow Filters
| Filter | Primary effect | Typical use |
|---|---|---|
BLUR | Softens image details | Creating a soft-focus result or reducing visible detail |
CONTOUR | Emphasizes contour-like boundaries | Making major shapes and outlines more noticeable |
DETAIL | Enhances fine detail | Making textures and small features more apparent |
EDGE_ENHANCE | Makes existing edges more prominent | Increasing edge definition without fully detecting outlines |
EMBOSS | Creates a raised, relief-like appearance | Producing a carved or embossed visual effect |
FIND_EDGES | Detects and highlights edges | Emphasizing object boundaries and intensity transitions |
SMOOTH | Reduces small pixel variations | Producing a softer, less noisy appearance |
SHARPEN | Increases perceived sharpness | Strengthening the definition of image details and edges |
The visible result depends on the source image. A detailed photograph may show filter differences clearly, while a plain image with little texture or contrast may not.
Example: Apply a Blur Filter
BLUR spreads local image information, reducing fine detail and producing a soft-focus effect.
from PIL import Image, ImageFilter
img = Image.open('input.jpg')
blurred = img.filter(ImageFilter.BLUR)
blurred.show()
blurred.save('input_blurred.png')
The original img remains available. The blurred variable refers to the new processed image.
Example: Detect Image Edges
FIND_EDGES highlights places where pixel intensity changes. These changes often correspond to object boundaries, outlines, or strong transitions between light and dark areas.
from PIL import Image, ImageFilter
img = Image.open('input.jpg')
image_edges = img.filter(ImageFilter.FIND_EDGES)
image_edges.show()
image_edges.save('input_edges.png')
The result is useful for inspecting outlines, but it is not the same as a complete object-recognition system. It identifies visual transitions rather than understanding what an object is.
Convert a Color Image to Grayscale
Grayscale conversion is different from filtering. Use the Image.convert() method, not ImageFilter, to change the image color mode.
from PIL import Image
img = Image.open('input.jpg')
black_white_image = img.convert('L')
black_white_image.show()
black_white_image.save('input_grayscale.png')
The mode 'L' means luminance. An 'L' image stores brightness values rather than separate red, green, and blue channels. It can contain many shades between dark and light, so it is grayscale but not necessarily a two-color black-and-white image.
| Operation | Pillow method or module | Purpose | Example |
|---|---|---|---|
| Apply a visual filter | ImageFilter with Image.filter() | Change detail, edges, softness, or visual style | filtered = img.filter(ImageFilter.SHARPEN) |
| Convert to grayscale | Image.convert() | Change the color representation to luminance values | gray = img.convert('L') |
If an application requires only pure black and pure white pixels, grayscale conversion alone is not enough. A separate thresholding or binary-conversion workflow is required.
Compare Several Filters
Applying multiple filters independently to one source image makes their differences easier to recognize.
from PIL import Image, ImageFilter
img = Image.open('input.jpg')
blurred = img.filter(ImageFilter.BLUR)
sharpened = img.filter(ImageFilter.SHARPEN)
embossed = img.filter(ImageFilter.EMBOSS)
edges = img.filter(ImageFilter.FIND_EDGES)
blurred.save('result_blur.png')
sharpened.save('result_sharpen.png')
embossed.save('result_emboss.png')
edges.save('result_edges.png')
- Compare
BLURandSHARPENto see how softness and edge definition differ. - Use
EMBOSSto inspect how shading can suggest raised surfaces. - Use
FIND_EDGESto focus on boundaries rather than normal color and texture.
Chain Image Operations
Because filtering returns an image, the returned image can be used as the input to another operation. This is called chaining.
from PIL import Image, ImageFilter
img = Image.open('input.jpg')
processed = img.filter(ImageFilter.SHARPEN)
processed = processed.convert('L')
processed = processed.filter(ImageFilter.FIND_EDGES)
processed.show()
processed.save('sharpened_grayscale_edges.png')
Each statement creates or returns an image for the next step. Preserve the original by continuing to use separate variables or by never assigning processed results back to the source variable.
A Typical Filter Workflow
- Import
Imageand, when needed,ImageFilter. - Open the source file with
Image.open(). - Apply a filter with
filter(), or convert the color mode withconvert('L'). - Inspect the result with
show()or another image viewer. - Save the processed image under a different filename.
from PIL import Image, ImageFilter
source = Image.open('input.jpg')
result = source.filter(ImageFilter.DETAIL)
result.save('input_detail.png')
Troubleshooting
ImageFilter is not defined
Import the module before referring to its filters:
from PIL import ImageFilter
Without this import, expressions such as ImageFilter.BLUR and ImageFilter.FIND_EDGES cannot be resolved.
The original image appears unchanged
The result of filter() may have been discarded. Store it and then display or save that variable:
processed_image = img.filter(ImageFilter.BLUR)
processed_image.show()
The source image was overwritten
Saving to the same path as the input can replace the original file. Use a distinct output path such as input_blurred.png while testing.
The grayscale image is not only black and white
convert('L') creates luminance grayscale with many possible brightness levels. It does not create a strictly two-color image. Use a separate thresholding or binary conversion process when only black and white pixels are wanted.
Filter effects are hard to see
Try a photograph containing textures, objects, and strong boundaries. Also save several results from the same source and compare them side by side. Effects vary with image content, contrast, size, and detail.
Key Terms
- Pillow: A Python imaging library for manipulating image files.
- PIL: The import namespace used by Pillow.
- ImageFilter: The Pillow module containing predefined image filters.
Image.filter(): An image method that applies a filter and returns a processed image.Image.convert(): An image method that converts an image to a specified color mode.- RGB: A color model using red, green, and blue channels.
- Grayscale: An image representation based on brightness rather than full color.
'L'mode: Pillow's luminance mode for grayscale images.
Exam-Ready Summary
- Import built-in filters with
from PIL import ImageFilter. - Open an image first; filters operate on an existing Pillow image object.
- Apply a filter with
img.filter(filter_object). filter()returns a new image, so assign its result.- Use
show()to preview andsave()to write output. - Use
img.convert('L')for luminance grayscale, notImageFilter. - Use separate filenames to preserve the original image.
For a compact reference, see Using Image Filters.