Open In App

Python Pillow Tutorial

Improve
Improve
Like Article
Like
Save
Share
Report

sinceDigital Image processing means processing the image digitally with the help of a computer. Using image processing we can perform operations like enhancing the image, blurring the image, extracting text from images, and many more operations. There are various ways to process images digitally. Here we will discuss the Pillow module of Python. Python Pillow is built on the top of PIL (Python Image Library) and is considered as the fork for the same as PIL has been discontinued since 2011. Pillow supports many image file formats including BMP, PNG, JPEG, and TIFF. The library encourages adding support for newer formats in the library by creating new file decoders.

This article aims at providing information about Python Pillow from basics to advance with the help of well-explained concepts and examples. So, let’s not waste any of the time and dive deep into the Pillow.

Installation

Python Pillow does not come in-built with Python. To install it type the below command in the terminal.

pip install pillow

python pillow tutorial installation

After installation let’s get started using the pillow module.

Opening and Displaying the image

The Pillow module provides the open() and show() function to read and display the image respectively. For displaying the image Pillow first converts the image to a .png format (on Windows OS) and stores it in a temporary buffer and then displays it. Therefore, due to the conversion of the image format to .png some properties of the original image file format might be lost (like animation). Therefore, it is advised to use this method only for test purposes.

Example:

 

Image Used for all the below Examples:

Python3
from PIL import Image


# Location of the image
img = Image.open("geek.jpg")

img.show()


 

Output:

read and siplay image python pil


Refer to the below articles to get detailed information about opening and displaying images.

Getting information about the opened image

Getting the Size, and format of the Image

  • size attribute provides the size of the image. It returns a tuple that contains width and height.
  • format attribute returns the format of the image file.

Example:

Python3
from PIL import Image


# Location of the image
img = Image.open("geek.jpg")

# size of the image
print(img.size)

# format of the image
print(img.format)

 

Output:

(287, 70)
JPEG

Refer to the below article to get detailed information about Getting the Size, and format of the Image

Getting Color mode of the image

The mode attribute of the image tells the type and depth of the pixel in the image. A 1-bit pixel has a range of 0-1, and an 8-bit pixel has a range of 0-255. There are different modes provided by this module. A few of them are:

ModeDescription
11-bit pixels, black and white
L8-bit pixels, Grayscale
P8-bit pixels, mapped to any other mode using a color palette
RGB3×8-bit pixels, true color
RGBA4×8-bit pixels, true color with transparency mask

Example:

Python3
from PIL import Image


# Location of the image
img = Image.open("geek.jpg")

# mode of the image
print(img.mode)

 

Output:

RGB

Rotating the Image

rotate() method of the Image class is used to rotate the image by a particular angle counterclockwise around its center. After rotating the image, the sections of the image having no pixel values are filled with black (for non-alpha images) and with completely transparent pixels (for images supporting transparency).

Syntax:

new_object = PIL.Image.Image.rotate(image_object, angle, resample=0, expand=0)

OR

new_object = image_object.rotate(angle, resample=0, expand=0)

Example:

Python3
# Importing Image module from 
# PIL package
from PIL import Image
import PIL

# creating a image object (main image)
im1 = Image.open(r"geek.jpg")

# rotating a image 90 deg counter clockwise
im1 = im1.rotate(90, PIL.Image.NEAREST, expand = 1)

# to show specified image
im1.show()

 

Output:
 

python pil tutorial rotate image


Refer to the below articles to get detailed information about rotating the image.

Flipping the Image

Image.transpose() is used to transpose the image (flip or rotate in 90 degree steps). 

Syntax:

transpose(degree)

Keywords FLIP_TOP_BOTTOM and FLIP_LEFT_RIGHT will be passed to transpose method to flip it.

  • FLIP_TOP_BOTTOM – returns an original image flipped Vertically
  • FLIP_LEFT_RIGHT – returns an original image flipped Horizontally


Example:

Python3
# importing PIL Module
from PIL import Image

# open the original image
original_img = Image.open("geek.jpg")

# Flip the original image vertically
vertical_img = original_img.transpose(method=Image.FLIP_TOP_BOTTOM)
vertical_img.save("vertical.png")

vertical_img.show()

# close all our files object
original_img.close()
vertical_img.close()

Output:

flip image python pil

Refer to the below articles to get detailed information about flipping images.

Resizing the image 

Image.resize() returns a resized copy of the image. Interpolation happens during the resize process, due to which the quality of image changes whether it is being upscaled (resized to a higher dimension than original) or downscaled (resized to a lower Image then original). Therefore resize() should be used cautiously and while providing suitable value for resampling argument.

Syntax: 

Image.resize(size, resample=0)

Example: 

Python3
# Importing Image class from PIL module
from PIL import Image

# Opens a image in RGB mode
im = Image.open(r"geek.jpg")

# Size of the image in pixels 
# (size of original image)
# (This is not mandatory)
width, height = im.size

# Setting the points for cropped image
left = 4
top = height / 5
right = 154
bottom = 3 * height / 5

# Cropped image of above dimension
# (It will not change original image)
im1 = im.crop((left, top, right, bottom))
newsize = (300, 300)
im1 = im1.resize(newsize)

# Shows the image in image viewer
im1.show()

Output:

python pil tutorial resize image

Refer to the below article to get detailed information about resizing images.

Saving the Image

Image.save() saves the image under the given filename. If no format is specified, the format to use is determined from the filename extension, if possible. You can use a file object instead of a filename. In this case, you must always specify the format. The file object must implement the seek, tell, and write methods, and be opened in binary mode.

Syntax: 

Image.save(fp, format=None, **params)

Example:

Python3
from PIL import Image


size = (40, 40)
img = Image.open(r"geek.jpg")

print("Original size of the image")
print(img.size)

# resizing the image
r_img = img.resize(size, resample = Image.BILINEAR)

# resized_test.png => Destination_path
r_img.save("resized_test.jpg")

# Opening the new image
img = Image.open(r"resized_test.jpg")

print("\nNew size of the image")
print(img.size)

Output:

Original size of the image
(287, 70)
New size of the image
(40, 40)

Till now, we have learned the basics of pillow now let’s start with some complex operations like blurring the image of merging two images or even creating a thumbnail. So let’s get started by merging images.

Merging Images

Image.merge() is used to merge a set of single band images into a new multiband image.  

Syntax: 

PIL.Image.merge(mode, bands)

Parameters:

mode – The mode to use for the output image. See: Modes.

bands – A sequence containing one single-band image for each band in the output image. All bands must have the same size.

Returns: An Image object.

Note: We will be using Image.split() method to split the image into individual bands.


Example:

Python3
# importing Image class from PIL package
from PIL import Image

# creating a object
image = Image.open(r"geek.jpg")
image.load()

# Splitting the image into individual
# bands
r, g, b, = image.split()

# merge function used
im1 = Image.merge('RGB', (g, b, r))
im1.show()

Output:

merge image python pil

Merging Two or More Images

Using the merge() method we can also merge two or more images. We have to select two images of the same size or we can resize the image. Then using the new() function we will create a new image and will paste all the images there. See the below example for a better understanding.

Example:

Images Used:


Python3
from PIL import Image

img_01 = Image.open("digit-number-img-0.jpg")
img_02 = Image.open("digit-number-img-1.jpg")
img_03 = Image.open("digit-number-img-2.jpg")
img_04 = Image.open("digit-number-img-3.jpg")

img_01_size = img_01.size
img_02_size = img_02.size
img_03_size = img_02.size
img_02_size = img_02.size

print('img 1 size: ', img_01_size)
print('img 2 size: ', img_02_size)
print('img 3 size: ', img_03_size)
print('img 4 size: ', img_03_size)

new_im = Image.new('RGB', (2*img_01_size[0],2*img_01_size[1]), (250,250,250))

new_im.paste(img_01, (0,0))
new_im.paste(img_02, (img_01_size[0],0))
new_im.paste(img_03, (0,img_01_size[1]))
new_im.paste(img_04, (img_01_size[0],img_01_size[1]))

new_im.save("merged_images.png", "PNG")
new_im.show()

Output:

merge two or more images python pil

Refer to the below articles to get detailed information about merging images.

Creating a Thumbnail

Image.thumbnail() convert the image into a thumbnail. This method modifies the image to contain a thumbnail version of itself, no larger than the given size. This method calculates an appropriate thumbnail size to preserve the aspect of the image, calls the draft() method to configure the file reader (where applicable), and finally resizes the image.

Note: This function modifies the Image object in place. If you need to use the full resolution image as well, apply this method to a copy() of the original image.

Example:

Image Used:

Python3
# importing Image class from PIL package
from PIL import Image

# creating a object
image = Image.open(r"image.jpg")
MAX_SIZE = (100, 100)

# Creating the thumbnail
image.thumbnail(MAX_SIZE)

image.show()

 

Output:

Refer to the below articles to get detailed information about creating thumbnails.

Cropping the Image

Cropping is the process of selecting only a part of the image. The crop() method is used to crop a rectangular portion of any image.

Syntax: 

PIL.Image.crop(box = None)

Parameters:

box: a 4-tuple defining the left, upper, right, and lower pixel coordinate.

Example:

Python3
# Importing Image class from PIL module
from PIL import Image

# Opens a image in RGB mode
im = Image.open(r"geek.jpg")

# Size of the image in pixels 
# (size of original image)
# (This is not mandatory)
width, height = im.size

# Setting the points for cropped image
left = 5
top = height / 4
right = 164
bottom = 3 * height / 4

# Cropped image of above dimension
# (It will not change original image)
im1 = im.crop((left, top, right, bottom))

# Shows the image in image viewer
im1.show()

Output:

crop image python pil

Refer to the below articles to get detailed information about Cropping images.

Blurring the Image

If a blurred image is observed carefully then a common thing to notice is that image is smooth meaning edges are not observed. A filter used for blurring is also called a low pass filter because it allows the low frequency to enter and stop high frequency. The ImageFilter class in the pillow library provides various filters that can be applied using the filter() method. Let’s see some of the blurring filters provided by the pillow.

Simple Blur

This method blurs the image using the kernel matrix or through the convolution matrix. It can be applied using the BLUR parameter.

Syntax:

filter(ImageFilter.BLUR)

Note: For more information refer, What is Image Blurring

Example:

Python3
# Importing Image class from PIL module
from PIL import Image, ImageFilter

# Opens a image in RGB mode
im = Image.open(r"geek.jpg")

# Blurring the image
im1 = im.filter(ImageFilter.BLUR)

# Shows the image in image viewer
im1.show()

Output:

Gaussian Blur

The Gaussian filter is implemented as an Odd sized Symmetric Kernel (DIP version of a Matrix) which is passed through each pixel of the Region of Interest to get the desired effect. The kernel is not hard towards drastic color changed (edges) due to the pixels towards the center of the kernel having more weightage towards the final value than the periphery. A Gaussian filter could be considered as an approximation of the Gaussian Function (mathematics). The Pillow module provides the predefined gaussianblur kernel that does the underlying maths for us.

Syntax:

ImageFilter.GaussianBlur(radius=2)

Example:

Python3
# Importing Image class from PIL module
from PIL import Image, ImageFilter

# Opens a image in RGB mode
im = Image.open(r"geek.jpg")

# Blurring the image
im1 = im.filter(ImageFilter.GaussianBlur(4))

# Shows the image in image viewer
im1.show()

Output:

gaussain blur python pillow

Box blur 

Box blur is also known as box linear filter. Box blurs are frequently used to approximate Gaussian blur. A box blur is generally implemented as an image effect that affects the whole screen. The blurred color of the current pixel is the average of the current pixel’s color and its 8 neighboring pixels. Pillow provides the BoxBlur() method to do the same.

Syntax:

ImageFilter.BoxBlur(radius)

Example:

Python3
# Importing Image class from PIL module
from PIL import Image, ImageFilter

# Opens a image in RGB mode
im = Image.open(r"geek.jpg")

# Blurring the image
im1 = im.filter(ImageFilter.BoxBlur(4))

# Shows the image in image viewer
im1.show()

 
 

Output:


 

python pillow box blur


 

Refer to the below articles to get detailed information about blurring images.


 

Drawing on Images

Pillow provides the ImageDraw module that provides simple 2D graphics for Image objects. You can use this module to create new images, annotate or retouch existing images, and generate graphics on the fly for web use. Let’s see various figures or texts that we can draw on the image.

Adding Text

Adding text to an image can sometimes be very necessary as it can be used to provide some useful information to the image or can also be used to add a digital signature to the image. With pillow, we can easily add a text to any image. Let’s see the below example.

Python3
# import all the libraries
from PIL import Image
from PIL import ImageFont
from PIL import ImageDraw

# image opening
image = Image.open("image.jpg")

# creating a copy of original image
watermark_image = image.copy()

# Image is converted into editable form using
# Draw function and assigned to draw
draw = ImageDraw.Draw(watermark_image)

# ("font type",font size)
font = ImageFont.truetype("DroidSans.ttf", 50)

# Decide the text location, color and font 
# (255,255,255)-White color text
draw.text((0, 0), "GeeksforGeeks", (255, 255, 255), font=font)

watermark_image.show()

 

Output:

add text to image python pillow

  • Make the image editable using ImageDraw.
  • Use ImageFont to specify font and font size. This step is optional. It is for those who want their text to look cool or stylish because someone won’t select any font style then the system takes the default font style.
  • Create a Font using ImageFont module function truetype() as it needs two parameters that are (“font type”, size)
  • Then used text() function of draw object and pass the four-parameters (Point of starting for text, “sample text”, Color, ImageFont object).

Refer to the below articles to get detailed information about adding texts to the image.

Adding Multiline Texts

ImageDraw.Draw.multiline_text() is used to draws the string at the given position.

Syntax:

ImageDraw.Draw.multiline_text(xy, text, fill=None, font=None, anchor=None, spacing=0, align=”left”)

Example:

Python3
# Importing Image and ImageFont, ImageDraw 
# module from PIL package
from PIL import Image, ImageFont, ImageDraw

# creating a image object
image = Image.open(r'geek.jpg')

draw = ImageDraw.Draw(image)

# specified font size
font = ImageFont.truetype(r'DroidSans.ttf', 15)

text = u"""\
Geeks
FOR \n Geeks"""

# drawing text size
draw.text((6, 8), text, fill ="red", font = font, align ="right")

image.show()

Output:

multiline text python pillow

Drawing Line

ImageDraw.Draw.line() is used to draws a line between the coordinates in the xy list.

Syntax: 

ImageDraw.Draw.line(xy, fill=None, width=0)

Example:

Python3
# importing image object from PIL
import math
from PIL import Image, ImageDraw

w, h = 220, 190
shape = [(40, 40), (w - 10, h - 10)]

# creating new Image object
img = Image.new("RGB", (w, h))

# create line image
img1 = ImageDraw.Draw(img)
img1.line(shape, fill="none", width=0)
img.show()

Output:

draw line python pillow

Drawing Rectangle

ImageDraw.Draw.rectangle() is used to draw a rectangle.

Syntax: 

ImageDraw.Draw.rectangle(xy, fill=None, outline=None)

Example:

Python3
# importing image object from PIL
import math
from PIL import Image, ImageDraw

w, h = 220, 190
shape = [(40, 40), (w - 10, h - 10)]

# creating new Image object
img = Image.new("RGB", (w, h))

# create rectangle image
img1 = ImageDraw.Draw(img)
img1.rectangle(shape, fill="# ffff33", outline="red")
img.show()

Output:
 

draw rectangle python pillow

Drawing Polygon

ImageDraw.Draw.polygon() is used to draw a polygon. The polygon outline consists of straight lines between the given coordinates, plus a straight line between the last and the first coordinate.

Syntax:

ImageDraw.Draw.polygon(xy, fill=None, outline=None)

Example:

Python3
import math
from PIL import Image, ImageDraw
from PIL import ImagePath

side = 8
xy = [
    ((math.cos(th) + 1) * 90,
     (math.sin(th) + 1) * 60)
    for th in [i * (2 * math.pi) / side for i in range(side)]
]

image = ImagePath.Path(xy).getbbox()
size = list(map(int, map(math.ceil, image[2:])))

img = Image.new("RGB", size, "# f9f9f9")
img1 = ImageDraw.Draw(img)
img1.polygon(xy, fill="# eeeeff", outline="blue")
img.show()

Output:

draw  polygon python pillow

Enhancing Image

Python Pillow provides the ImageEnhance module to adjust the color, brightness, contrast, and sharpness of the image.

Adjusting Color and Contrast

ImageEnhance.Color() and ImageEnhance.Contrast() methods are used to adjust the color and contrast of the image respectively.

  • ImageEnhance.Color() is used to adjust the color balance of an image, in a manner similar to the controls on a color TV set. An enhancement factor of 0.0 gives a black and white image. A factor of 1.0 gives the original image.

Syntax:

ImageEnhance.Color(image)

Example:

Python3
# This will import Image and ImageEnhance modules
from PIL import Image, ImageEnhance

# Opening Image
im = Image.open(r"geek.jpg")

# Creating object of Color class
im3 = ImageEnhance.Color(im)

# showing resultant image
im3.enhance(5.0).show()

Output:

enhance clor python pillow

  • ImageEnhance.Contrast() is used to control the contrast of an image, similar to the contrast control on a TV set. An enhancement factor of 0.0 gives a solid grey image. A factor of 1.0 gives the original image.

Syntax:

obj = ImageEnhance.Contrast(image)

obj.enhance(factor)

Example:

Python3
# This will import Image and ImageEnhance modules
from PIL import Image, ImageEnhance

# Opening Image
im = Image.open(r"geek.jpg")

# Creating object of Contrast class
im3 = ImageEnhance.Contrast(im)

# showing resultant image
im3.enhance(5.0).show()

Output:

enhance contrast python pillow


 

Refer to the below articles to get detailed information about enhancing color and contrast.

Adjusting Brightness and Sharpness

ImageEnhance.Brightness() and ImageEnhance.Sharpness() methods are used to adjust the brightness and sharpness of the image.

  •  ImageEnhance.Brightness() is used to control the brightness of an image. An enhancement factor of 0.0 gives a black image. A factor of 1.0 gives the original image.

Syntax:

obj = ImageEnhance.Brightness(image)

obj.enhance(factor)

Example:

Python3
# This will import Image and ImageEnhance modules
from PIL import Image, ImageEnhance

# Opening Image
im = Image.open(r"geek.jpg")

# Creating object of Brightness class
im3 = ImageEnhance.Brightness(im)

# showing resultant image
im3.enhance(1.5).show()

 

Output:

adjuts brightness python pillow

  • ImageEnhance.Sharpness() is used to adjust the sharpness of an image. An enhancement factor of 0.0 gives a blurred image, a factor of 1.0 gives the original image, and a factor of 2.0 gives a sharpened image.

Syntax:

obj = ImageEnhance.Sharpness(image)

obj.enhance(factor)

Example:

Python3
# This will import Image and ImageChops modules
from PIL import Image, ImageEnhance

# Opening Image
im = Image.open(r"geek.jpg")

# Creating object of Sharpness class
im3 = ImageEnhance.Sharpness(im)

# showing resultant image
im3.enhance(5.0).show()

Output:

enhance sharpness python pillow

Refer to the below articles to get detailed information about enhancing the brightness and sharpness of the image.

Convert images between various Formats

Advance Operations on Image using Pillow

Python Pillow Exercises and Applications



Last Updated : 18 Mar, 2024
Like Article
Save Article
Share your thoughts in the comments
Similar Reads