- Python, Python-pil

Python Pillow Tutorial

Digital 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 from 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.InstallationPython Pillow does not come in-built with Python. To install it type the below command in the terminal.pip install pillow After installation let’s get started using the pillow module.Opening and Displaying the imageThe 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: Python3from PIL import Image    img = Image.open(“geek.jpg”)  img.show()Output: Refer to the below articles to get detailed information about opening and displaying images.Getting information about the opened imageGetting the Size, and format of the Imagesize 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:Python3from PIL import Image    img = Image.open(“geek.jpg”)  print(img.size)  print(img.format)Output:(287, 70)
JPEGRefer to the below article to get detailed information about Getting the Size, and format of the ImageGetting Color mode of the imageThe 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:ModeDescription11-bit pixels, black and whiteL8-bit pixels, GreyscaleP8-bit pixels, mapped to any other mode using a color paletteRGB3×8-bit pixels, true colorRGBA4×8-bit pixels, true color with transparency maskExample:Python3from PIL import Image    img = Image.open(“geek.jpg”)  print(img.mode)Output:RGBRotating the Imagerotate() 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)ORnew_object = image_object.rotate(angle, resample=0, expand=0)Example:Python3from PIL import Imageimport PIL  im1 = Image.open(r”geek.jpg”)  im1 = im1.rotate(90, PIL.Image.NEAREST, expand = 1)  im1.show()Output: Refer to the below articles to get detailed information about rotating the image.Flipping the ImageImage.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 VerticallyFLIP_LEFT_RIGHT – returns an original image flipped HorizontallyExample:Python3from PIL import Image  original_img = Image.open(“geek.jpg”)  vertical_img = original_img.transpose(method=Image.FLIP_TOP_BOTTOM)vertical_img.save(“vertical.png”)  vertical_img.show()  original_img.close()vertical_img.close()Output: 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:Python3from PIL import Image  im = Image.open(r”geek.jpg”)  width, height = im.size  left = 4top = height / 5right = 154bottom = 3 * height / 5  im1 = im.crop((left, top, right, bottom))newsize = (300, 300)im1 = im1.resize(newsize)  im1.show()Output: Refer to the below article to get detailed information about resizing images.Saving the ImageImage.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:Python3from PIL import Image    size = (40, 40)img = Image.open(r”geek.jpg”)  print(“Original size of the image”)print(img.size)  r_img = img.resize(size, resample = Image.BILINEAR)  r_img.save(“resized_test.jpg”)  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 ImagesImage.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:Python3from PIL import Image  image = Image.open(r”geek.jpg”)image.load()  r, g, b, = image.split()  im1 = Image.merge(‘RGB’, (g, b, r))im1.show()Output: Merging Two or More ImagesUsing 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: Python3from 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.sizeimg_02_size = img_02.sizeimg_03_size = img_02.sizeimg_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: Refer to the below articles to get detailed information about merging images.Creating a ThumbnailImage.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: Python3from PIL import Image  image = Image.open(r”image.jpg”)MAX_SIZE = (100, 100)  image.thumbnail(MAX_SIZE)  image.show()Output: Refer to the below articles to get detailed information about creating thumbnails.Cropping the ImageCropping 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:Python3from PIL import Image  im = Image.open(r”geek.jpg”)  width, height = im.size  left = 5top = height / 4right = 164bottom = 3 * height / 4  im1 = im.crop((left, top, right, bottom))  im1.show()Output: Refer to the below articles to get detailed information about Cropping images.Blurring the ImageIf 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 BlurThis 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 BlurringExample:Python3from PIL import Image  im = Image.open(r”geek.jpg”)  im1 = im.filter(ImageFilter.BLUR)  im1.show()Output: Gaussian BlurThe 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:Python3from PIL import Image  im = Image.open(r”geek.jpg”)  im1 = im.filter(ImageFilter.GaussianBlur(4))  im1.show()Output: 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:Python3from PIL import Image  im = Image.open(r”geek.jpg”)  im1 = im.filter(ImageFilter.BoxBlur(4))  im1.show()Output: Refer to the below articles to get detailed information about blurring images.Drawing on ImagesPillow 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 TextAdding 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 tex to any image. Let’s see the below example.Python3from PIL import Imagefrom PIL import ImageFontfrom PIL import ImageDraw  image = Image.open(“image.jpg”)  watermark_image = image.copy()  draw = ImageDraw.Draw(watermark_image)  font = ImageFont.truetype(“DroidSans.ttf”, 50)  draw.text((0, 0), “GeeksforGeeks”, (255, 255, 255), font=font)  watermark_image.show()Output: 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 TextsImageDraw.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:Python3from PIL import Image, ImageFont, ImageDraw  image = Image.open(r’geek.jpg’)  draw = ImageDraw.Draw(image)  font = ImageFont.truetype(r’DroidSans.ttf’, 15)  text = u  draw.text((6, 8), text, fill =”red”, font = font, align =”right”)  image.show()Output: Drawing LineImageDraw.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:Python3import mathfrom PIL import Image, ImageDraw  w, h = 220, 190shape = [(40, 40), (w – 10, h – 10)]  img = Image.new(“RGB”, (w, h))  img1 = ImageDraw.Draw(img)img1.line(shape, fill=”none”, width=0)img.show()Output: Drawing RectangleImageDraw.Draw.rectangle() is used to draw a rectangle.Syntax: ImageDraw.Draw.rectangle(xy, fill=None, outline=None)Example:Python3import mathfrom PIL import Image, ImageDraw  w, h = 220, 190shape = [(40, 40), (w – 10, h – 10)]  img = Image.new(“RGB”, (w, h))  img1 = ImageDraw.Draw(img)img1.rectangle(shape, fill=”# ffff33″, outline=”red”)img.show()Output: Drawing PolygonImageDraw.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:Python3import mathfrom PIL import Image, ImageDrawfrom PIL import ImagePath  side = 8xy = [    ((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: Enhancing ImagePython Pillow provides the ImageEnhance module to adjust the color, brightness, contrast, and sharpness of the image.Adjusting Color and ContrastImageEnhance.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:Python3from PIL import Image, ImageEnhance  im = Image.open(r”geek.jpg”)  im3 = ImageEnhance.Color(im)  im3.enhance(5.0).show()Output: 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:Python3from PIL import Image, ImageEnhance  im = Image.open(r”geek.jpg”)  im3 = ImageEnhance.Contrast(im)  im3.enhance(5.0).show()Output: Refer to the below articles to get detailed information about enhancing color and contrast.Adjusting Brightness and SharpnessImageEnhance.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:Python3from PIL import Image, ImageEnhance  im = Image.open(r”geek.jpg”)  im3 = ImageEnhance.Brightness(im)  im3.enhance(1.5).show()Output: 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:Python3from PIL import Image, ImageEnhance  im = Image.open(r”geek.jpg”)  im3 = ImageEnhance.Sharpness(im)  im3.enhance(5.0).show()Output: Refer to the below articles to get detailed information about enhancing the brightness and sharpness of the image.Convert images between various FormatsAdvance Operations on Image using PillowPython Pillow Exercises and Applications Attention geek! Strengthen your foundations with the Python Programming Foundation Course and learn the basics.  To begin with, your interview preparations Enhance your Data Structures concepts with the Python DS Course. And to begin with your Machine Learning Journey, join the Machine Learning – Basic Level Course