Enhancing Scanned Documents with Pillow

Scanned documents often suffer from various issues such as low contrast, noise, and improper orientation. These problems can make it difficult to read or extract information from the scanned content. Pillow, the friendly fork of the Python Imaging Library (PIL), provides a powerful set of tools to address these challenges and enhance the quality of scanned documents. In this blog post, we will explore how to use Pillow to improve the visual quality of scanned documents, including adjusting contrast, removing noise, and rotating images.

Table of Contents

  1. Core Concepts
  2. Typical Usage Scenarios
  3. Common Pitfalls
  4. Best Practices
  5. Code Examples
  6. Conclusion
  7. References

Core Concepts

Image Processing Basics

Pillow represents images as Image objects. These objects can be loaded from files, created from scratch, or modified using various methods. Some of the fundamental operations for enhancing scanned documents include:

  • Contrast Adjustment: Changing the difference between the lightest and darkest parts of an image to make text and graphics more distinguishable.
  • Noise Reduction: Removing random variations in pixel values that can make an image look grainy or blurry.
  • Rotation: Correcting the orientation of a scanned document if it is tilted or upside down.

Pillow Image Filters

Pillow provides a range of built - in image filters that can be applied to Image objects. For example, the ImageFilter.SHARPEN filter can be used to enhance the edges of text and graphics, while the ImageFilter.MedianFilter can be used to reduce noise.

Color Modes

Images in Pillow can have different color modes, such as RGB (Red, Green, Blue) for color images and L (Luminance) for grayscale images. Converting an image to grayscale can simplify the processing and reduce file size, which is often beneficial for scanned documents.

Typical Usage Scenarios

Optical Character Recognition (OCR)

Before performing OCR on a scanned document, it is crucial to enhance the image quality. By adjusting contrast, removing noise, and ensuring proper orientation, the accuracy of OCR software can be significantly improved.

Archiving

When archiving scanned documents, enhancing the image quality can make them more readable and accessible in the long term. This is especially important for historical or legal documents.

Document Sharing

If you need to share a scanned document with others, improving its visual quality can ensure that the recipients can easily read and understand the content.

Common Pitfalls

Over - Processing

Applying too many filters or making extreme adjustments to an image can lead to over - processing. This can result in artifacts, loss of detail, and reduced readability. For example, excessive sharpening can make text look jagged.

Incorrect Color Mode Conversion

Converting an image to the wrong color mode can cause problems. For instance, converting a color image to grayscale when it contains important color information can lead to loss of data.

Memory Issues

Processing large images can consume a significant amount of memory. If your system has limited memory, you may encounter errors or slow performance.

Best Practices

Start with a Backup

Always make a copy of the original scanned document before applying any enhancements. This way, you can revert back to the original if something goes wrong.

Test Different Settings

When adjusting contrast, brightness, or applying filters, test different settings on a small area of the image first. This can help you find the optimal settings without affecting the entire image.

Use Appropriate Filters

Choose the right filters based on the specific issues in the scanned document. For example, use a median filter for salt - and - pepper noise and a Gaussian blur for general blurring.

Code Examples

Installing Pillow

If you haven’t installed Pillow yet, you can install it using pip:

pip install pillow

Loading and Displaying an Image

from PIL import Image

# Load an image
image = Image.open('scanned_document.jpg')

# Display the image
image.show()

Converting to Grayscale

from PIL import Image

# Load the image
image = Image.open('scanned_document.jpg')

# Convert the image to grayscale
grayscale_image = image.convert('L')

# Save the grayscale image
grayscale_image.save('scanned_document_grayscale.jpg')

Adjusting Contrast

from PIL import Image, ImageEnhance

# Load the image
image = Image.open('scanned_document.jpg')

# Create a Contrast enhancer object
contrast_enhancer = ImageEnhance.Contrast(image)

# Increase the contrast by a factor of 1.5
enhanced_image = contrast_enhancer.enhance(1.5)

# Save the enhanced image
enhanced_image.save('scanned_document_enhanced_contrast.jpg')

Removing Noise with a Median Filter

from PIL import Image, ImageFilter

# Load the image
image = Image.open('scanned_document.jpg')

# Apply a median filter with a size of 3
denoised_image = image.filter(ImageFilter.MedianFilter(size=3))

# Save the denoised image
denoised_image.save('scanned_document_denoised.jpg')

Rotating an Image

from PIL import Image

# Load the image
image = Image.open('scanned_document.jpg')

# Rotate the image by 90 degrees counter - clockwise
rotated_image = image.rotate(90)

# Save the rotated image
rotated_image.save('scanned_document_rotated.jpg')

Conclusion

Pillow is a powerful and versatile library for enhancing scanned documents. By understanding the core concepts, being aware of common pitfalls, and following best practices, you can effectively improve the quality of scanned documents. Whether you are preparing documents for OCR, archiving, or sharing, Pillow provides the tools you need to achieve the desired results.

References