Before you go, check out these stories!

Hackernoon logoIntro to Image Processing in Python with Pillow by@kalebujordan

Intro to Image Processing in Python with Pillow

Author profile picture

@kalebujordanKalebu Jordan

I'm a Mechatronics engineer | Pro Python Developer | AI Enthusiast

Pillow is Python Imaging Library that is free and open-source an additional library for the Python programming language that adds support for opening, manipulating, and saving in a variety of extension.

Let’s get started

The most important class in the Python Imaging Library is the Image class, defined in the module with the same name.

We use open ( ) to open image in our local directory as shown below;

>>> from PIL import Image
>>> sample ='sample.jpg')

That’s simple, you have already read an image with pillow, you can now do something image processing with it, You can also check the type of the image we just loaded;

>>> type(sample)
<class 'PIL.JpegImagePlugin.JpegImageFile'>

You can view your image property such format, size, and color mode as shown below

>>> sample.format
>>> sample.size
(250, 283)
>>> sample.mode

Also, you can display the image you have just read to the screen, using the show method



Image Format Conversion

Once you are done opening your image with the pillow library in one format you can save it again in other formats like from jpg to png and much more.

For instance, let’s try to write a simple Python program to convert all images on your project directory which are in jpg format to png format.

import os
import sys
from PIL import Image
jpg_images = [image for image in os.listdir() if image.endswith('.jpg')]
for jpg_image in jpg_images:
        new_name = jpg_image.split('.')[0] + '.png'
    except IOError as error:
        print('Couldn\'t read {} '.format(jpg_image))

Once you run the above code on a project directory consisting of images in jpg format, it gonna open all of them and convert into png just as shown below, you could repeat the same process for other conversions.

Image Cropping

Pillow can also be used to perform image cropping whereby you can extract a sub rectangle of a given image by specifying coordinates of the sub rectangle.

Therefore before you perform cropping, you might wanna know the area of the rectangle to get a pair of coordinates you would like crop, you can easily observe them by showing to the screen.

>>> from PIL import Image
>>> picture ='sample.png')
>>> cord = (50, 50, 300, 300)
>>> new_picture = picture.crop(cord)


As we can see the image has been successful cropped. The coordinates of the surface to be cropped are represented by a diagonal coordinates.

Whereby the first two-point is (x, y) from the upper left diagonal point and next two-point (x2, y2) are also the diagonal point from the bottom right.

Geometrical Transformation

With pillow we can perform some geometrical transformation on our image include resizing image size and rotations.

This knowledge plays a great role when generating data for deep learning by transforming one image to form other tons of images from different angles.

Image resizing

>>> from PIL import Image
>>> image ='sample.png')
>>> resized_image = image.resize((200, 200))

When you run the above code you should see a newly resized image on your local directory with a dimension of 200 x 200.

Image Rotation

>>> from PIL import Image
>>> image ='sample.png')
>>> rotated_img = image.rotate(80)

Use rotation feature to generate 360 images of the same picture at different angles, doing this way will help us generate as many as data which you can potentially use to train your deep learning model.


from PIL import Image 
images = ['sample.jpg']
for img in images:
        org_img =
        for angle in range(1, 361):
            image_name = str(angle)+'.jpg'
            new_img = org_img.rotate(angle)
    except IOError:
        print('Couldn\'t read {}'.format(img))

After running the above script, you should see 360 images of the same original image at different angles as shown below.

Image Filtering

Filtering is a technique for modifying or enhancing an image. For example, you can filter an image to emphasize certain features or remove other features.

Image filtering is useful for many applications including smoothing, sharpening, removing noise, and edge detection.

There many filters available on Pillow Library including BLUR, BoxBlur, CONTOUR, FIND_EDGES, Filter, GaussianBlur, Kernel, MaxFilter, MedianFilter, SHARPEN, SMOOTH and etc.

Example of Usage.

Let’s try finding edges in the below picture using the FIND_EDGES filter

  • Sample image
  • >>> from PIL import Image
    >>> from PIL import Image, ImageFilter
    >>> image ='brain.jpeg')
    >>> edges = image.filter(ImageFilter.FIND_EDGES)


Same wise you can experiments with different filters in Python depending on what you’re trying wanna do.

Reading Image From open file

Also, you can use a pillow to read an Image from a Python file object as shown below;

>>> from PIL import Image
>>> image ='brain.jpeg', 'rb'))

Reading Image from URL

On this you will have to use Pillow in combination with requests, requests will have to send a get requests to the server to get the raw bytes of image and the pillow will read those bytes.

>>> import requests
>>> from PIL import Image
>>> url = ''
>>> raw = requests.get(url, stream=True).raw


Creating new Images

With Pillow you can also create a new blank image, of you might need for a variety of purposes, use ( ) to generate an entirely new image.

  • Syntax
  • new =, shape, color)
  • Example of Usage :
  • >>> from PIL import Image
    >>> new_img ='RGB', (500, 500), 'blue')

Drawing Rectangles on Images

Pillow can also be used to draw Rectangle on Images, this commonly applied on object detection whereby you can draw a rectangular box over a detected object.

  • Example of Usage

Let’s try drawing a rectangular box inside a blank image

>>> from PIL import Image, ImageDraw
>>> new_img ='RGB', (400, 400), 'black')
>>> pencil = ImageDraw.Draw(new_img)
>>> pencil.rectangle((200, 50, 300, 300), fill ='green')


The first two coordinates represent (x,y ) of the left upper diagonal and the next two (x2, y2) represent the coordinate point of the bottom right.

Drawing Text on Images

We can also use Pillow Library to draw Text on Images

>>> from PIL import Image , ImageDraw, ImageFont 
>>> new_img ='RGB', (200, 200), 'black')
>>> font = ImageFont.load_default()
>>> pencil = ImageDraw.Draw(new_img)
>>> pencil.text((100,100),'Hello World',  font=font, fill='blue')


Well that's all for today, hope you find it useful Now don't be shy, share it with your fellow developer

The Original Article can be found on

In case of any suggestion, comment, or difficulty drop it in community and I will get back to you ASAP.


Join Hacker Noon

Create your free account to unlock your custom reading experience.