Chapter 1. Getting Started With Image Processing: Add To Playlist Buy Ebook Bookmark Code Files
Chapter 1. Getting Started With Image Processing: Add To Playlist Buy Ebook Bookmark Code Files
2020, 17:37
We will start by defining what image processing is and what the applications of image processing are. Then we will
learn about the basic image processing pipeline—in other words, what are the steps to process an image on a
computer in general. Then, we will learn about different Python libraries available for image processing and how
to install them in Python 3. Next, we will learn how to write Python codes to read and write (store) images on
a computer using different libraries. After that, we will learn the data structures that are to be used to represent
an image in Python and how to display an image. We will also learn different image types and different image file
formats, and, finally, how to do basic image manipulations in Python.
By the end of this chapter, we should be able to conceptualize image processing, different steps, and different
applications. We should be able to import and call functions from different image processing libraries in
Python. We should be able to understand the data structures used to store different types of images in Python,
read/write image files using different Python libraries, and write Python code to do basic image manipulations.
The topics to be covered in this chapter are as follows:
data_and_business_intelligence/9781789343731/1/ch01lvl1sec11/what-is-image-processing-and-some-applications)
https://subscription.packtpub.com/book/big_data_and_business_intelligence/9781789343731/1 Page 1 of 2
What is image processing and some applications - Hands-On Image Processing with Python 03.12.2020, 17:37
In order to be able to process it on a computer, an image f(x,y) needs to be digitalized both spatially and in
amplitude. Digitization of the spatial coordinates (x,y) is called image sampling
sampling. Amplitude digitization is called
gray-level quantization
quantization. In a computer, a pixel value corresponding to a channel is generally represented as an
integer value between (0-255) or a floating-point value between (0-1). An image is stored as a file, and there can
be many different types (formats) of files. Each file generally has some metadata and some data that can be
extracted as multi-dimensional arrays (for example, 2-D arrays for binary or gray-level images and 3D arrays for
RGB and YUV colored images). The following figure shows how the image data is stored as matrices for different
types of image. As shown, for a grayscale image, a matrix (2-D array) of width x height suffices to store the
image, whereas an RGB image requires a 3-D array of a dimension of width x height x 3
3:
https://subscription.packtpub.com/book/big_data_and_business_intel…731/1/ch01lvl1sec11/what-is-image-processing-and-some-applications Page 1 of 4
What is image processing and some applications - Hands-On Image Processing with Python 03.12.2020, 17:37
The next figure shows example binary, grayscale, and RGB images:
https://subscription.packtpub.com/book/big_data_and_business_intel…31/1/ch01lvl1sec11/what-is-image-processing-and-some-applications Page 2 of 4
What is image processing and some applications - Hands-On Image Processing with Python 03.12.2020, 17:37
In this book, we shall focus on processing image data and will use Python libraries to extract the data from images
for us, as well as run different algorithms for different image processing tasks on the image data. Sample images
are taken from the internet, from the Berkeley Segmentation Dataset and Benchmark
(https://www2.eecs.berkeley.edu/Research/Projects/CS/vision/bsds/BSDS300/html/dataset/images.html
(https://www2.eecs.berkeley.edu/Research/Projects/CS/vision/bsds/BSDS300/html/dataset/images.html)),
and the USC-SIPI Image Database (http://sipi.usc.edu/database/ (http://sipi.usc.edu/database/)), and many of them
are standard images used for image processing.
In this book, we are going to use a few Python packages to process an image. First, we shall use a bunch of libraries
to do classical image processing: right from extracting image data, transforming the data with some algorithms
using library functions to pre-process, enhance, restore, represent (with descriptors), segment, classify, and
detect and recognize (objects) to analyze, understand, and interpret the data better. Next, we shall use another
bunch of libraries to do image processing based on deep learning, a technology that has became very popular in
the last few years.
https://subscription.packtpub.com/book/big_data_and_business_intel…31/1/ch01lvl1sec11/what-is-image-processing-and-some-applications Page 3 of 4
The image processing pipeline - Hands-On Image Processing with Python 03.12.2020, 17:37
' Run a few transformations on the image (sampling and manipulation; for example, grayscale conversion)
' Enhance the quality of the image (filtering; for example, deblurring)
4 Segmentation
Segmentation: The image needs to be segmented in order to extract the objects of interest.
5 Information extraction/representation
extraction/representation: The image needs to be represented in some alternative form; for
example, one of the following:
' Some hand-crafted feature-descriptor can be computed (for example, HOG descriptors, with classical
image processing) from the image
' Some features can be automatically learned from the image (for example, the weights and bias values
learned in the hidden layers of a neural net with deep learning)
6 Image understanding/interpretation:: This representation will be used to understand the image better with the
following:
' Image classification (for example, whether an image contains a human object or not)
https://subscription.packtpub.com/book/big_data_and_business_intelligence/9781789343731/1/ch01lvl1sec12/the-image-processing-pipeline Page 1 of 3
The image processing pipeline - Hands-On Image Processing with Python 03.12.2020, 17:37
' Object recognition ( for example,, finding the location of the car objects in an image with a bounding box)
The next figure represents different modules that we are going to use for different image processing tasks:
https://subscription.packtpub.com/book/big_data_and_business_intelligence/9781789343731/1/ch01lvl1sec12/the-image-processing-pipeline Page 2 of 3
The image processing pipeline - Hands-On Image Processing with Python 03.12.2020, 17:37
_business_intelligence/9781789343731/1/ch01lvl1sec13/setting-up-different-image-processing-libraries-in-python)
https://subscription.packtpub.com/book/big_data_and_business_intelligence/9781789343731/1/ch01lvl1sec12/the-image-processing-pipeline Page 3 of 3
Setting up different image processing libraries in Python - Hands-On Image Processing with Python 03.12.2020, 17:37
Installing pip
We are going to use the pip ( or pip3 ) tool to install the libraries, so—if it isn't already installed—we need
to install pip first. As mentioned here (https://pip.pypa.io/en/stable/installing/#do-i-need-to-install-pip
(https://pip.pypa.io/en/stable/installing/#do-i-need-to-install-pip)), pip is already installed if we are using
Python 3 >=3.4 downloaded from python.org, or if we are working in a Virtual Environment
(https://packaging.python.org/tutorials/installing-packages/#creating-and-using-virtual-environments
(https://packaging.python.org/tutorials/installing-packages/#creating-and-using-virtual-environments)) created
by virtualenv (https://packaging.python.org/key_projects/#virtualenv
(https://packaging.python.org/key_projects/#virtualenv)) or pyvenv
The matplotlib library will primarily be used for display purposes, whereas numpy will be used for storing
an image. The scikit-learn library will be used for building machine-learning models for image processing,
and scipy will be used mainly for image enhancements. The scikit-image , mahotas , and
opencv libraries will be used for different image processing algorithms.
https://subscription.packtpub.com/book/big_data_and_business_intelli…1lvl1sec13/setting-up-different-image-processing-libraries-in-python Page 1 of 4
Setting up different image processing libraries in Python - Hands-On Image Processing with Python 03.12.2020, 17:37
The following code block shows how the libraries that we are going to use can be downloaded and installed with
pip from a Python prompt (interactive mode):
Copy
There may be some additional installation instructions, depending on the OS platform you are going to use. We
suggest the reader goes through the documentation sites for each of the libraries to get detailed platform-specific
installation instructions for each library. For example, for the scikit-image library, detailed installation
instructions for different OS platforms can be found here: http://scikit-image.org/docs/stable/install.html
(http://scikit-image.org/docs/stable/install.html). Also, the reader should be familiar with websites such as
stackoverflow to resolve platform-dependent installation issues for different libraries.
Finally, we can verify whether a library is properly installed or not by importing it from the Python prompt. If the
library is imported successfully (no error message is thrown), then we don't have any installation issue. We can
print the version of the library installed by printing it to the console.
The following code block shows the versions for the scikit-image and PIL Python libraries:
Copy
Let us ensure that we have the latest versions of all of the libraries.
https://subscription.packtpub.com/book/big_data_and_business_intelli…lvl1sec13/setting-up-different-image-processing-libraries-in-python Page 2 of 4
Setting up different image processing libraries in Python - Hands-On Image Processing with Python 03.12.2020, 17:37
We also recommend to download and install the latest version of the Anaconda distribution; this will eliminate the
need for explicit installation of many Python packages.
( Note
More about installing Anaconda for different OSes can be found at https://conda.io/docs/user-guide/install/index.html
(https://conda.io/docs/user-guide/install/index.html).
( Note
More about running Jupyter notebooks can be found at http://jupyter-notebook-beginner-
guide.readthedocs.io/en/latest/execute.html (http://jupyter-notebook-beginner-
guide.readthedocs.io/en/latest/execute.html).
We can even install a Python package from inside a notebook cell; for example, we can install scipy with
the !pip install scipy command.
( Note
For more information on installing Jupyter, please refer to http://jupyter.readthedocs.io/en/latest/install.html
(http://jupyter.readthedocs.io/en/latest/install.html).
(/book/big_data_and_business_intelligence/9781789343731/1/ch01lvl1sec14/image-i-o-and-display-with-python)
https://subscription.packtpub.com/book/big_data_and_business_intelli…lvl1sec13/setting-up-different-image-processing-libraries-in-python Page 3 of 4
Image I/O and display with Python - Hands-On Image Processing with Python 03.12.2020, 17:38
Copy
Copy
https://subscription.packtpub.com/book/big_data_and_business_inte…/9781789343731/1/ch01lvl1sec14/image-i-o-and-display-with-python Page 1 of 10
Image I/O and display with Python - Hands-On Image Processing with Python 03.12.2020, 17:38
The following code block shows how to use the PIL function, convert() , to convert the colored RGB image
into a grayscale image:
Copy
https://subscription.packtpub.com/book/big_data_and_business_inte…/9781789343731/1/ch01lvl1sec14/image-i-o-and-display-with-python Page 2 of 10
Image I/O and display with Python - Hands-On Image Processing with Python 03.12.2020, 17:38
Copy
https://subscription.packtpub.com/book/big_data_and_business_inte…/9781789343731/1/ch01lvl1sec14/image-i-o-and-display-with-python Page 3 of 10
Image I/O and display with Python - Hands-On Image Processing with Python 03.12.2020, 17:38
The next code snippet changes the image to a darker image by first setting all of the pixel values below 0.5 to 0 and
then saving the numpy ndarray to disk. The saved image is again reloaded and displayed:
Copy
im1 = im
im1[im1 < 0.5] = 0 # make the image look darker
plt.imshow(im1)
plt.axis('off')
plt.tight_layout()
plt.savefig("../images/hill_dark.png") # save the dark image
im = mpimg.imread("../images/hill_dark.png") # read the dark image
plt.figure(figsize=(10,10))
plt.imshow(im)
plt.axis('off') # no axis ticks
plt.tight_layout()
plt.show()
The next figure shows the darker image saved with the preceding code:
https://subscription.packtpub.com/book/big_data_and_business_inte…/9781789343731/1/ch01lvl1sec14/image-i-o-and-display-with-python Page 4 of 10
Image I/O and display with Python - Hands-On Image Processing with Python 03.12.2020, 17:38
The next code block demonstrates how to use different interpolation methods with imshow() :
Copy
https://subscription.packtpub.com/book/big_data_and_business_inte…/9781789343731/1/ch01lvl1sec14/image-i-o-and-display-with-python Page 5 of 10
Image I/O and display with Python - Hands-On Image Processing with Python 03.12.2020, 17:38
ndarray of type uint8 (8-bit unsigned integer). Hence, the pixel values will be in between 0 and 255. Then it
converts (changes the image type or mode, which will be discussed shortly) the colored RGB image into an HSV
image using the hsv2rgb() function from the Image.color module. Next, it changes the saturation
(colorfulness) to a constant value for all of the pixels by keeping the hue and value channels unchanged. The image
is then converted back into RGB mode with the rgb2hsv() function to create a new image, which is then
saved and displayed:
Copy
The next figure shows the output of the previous code—a new image with changed saturation:
https://subscription.packtpub.com/book/big_data_and_business_inte…/9781789343731/1/ch01lvl1sec14/image-i-o-and-display-with-python Page 6 of 10
Image I/O and display with Python - Hands-On Image Processing with Python 03.12.2020, 17:38
We can use the scikit-image viewer module also to display an image in a pop-up window, as shown in the
following code:
Copy
viewer = viewer.ImageViewer(im)
viewer.show()
Copy
im = data.astronaut()
imshow(im), show()
https://subscription.packtpub.com/book/big_data_and_business_inte…/9781789343731/1/ch01lvl1sec14/image-i-o-and-display-with-python Page 7 of 10
Image I/O and display with Python - Hands-On Image Processing with Python 03.12.2020, 17:38
Copy
The next figure shows the output of the previous code, which displays the misc module's face image:
https://subscription.packtpub.com/book/big_data_and_business_inte…/9781789343731/1/ch01lvl1sec14/image-i-o-and-display-with-python Page 8 of 10
Image I/O and display with Python - Hands-On Image Processing with Python 03.12.2020, 17:38
We can read an image from disk using misc.imread() . The next code block shows an example:
Copy
im = misc.imread('../images/pepper.jpg')
print(type(im), im.shape, im.dtype)
# <class 'numpy.ndarray'> (225, 225, 3) uint8
The I/O function's imread() is deprecated in SciPy 1.0.0, and will be removed in 1.2.0, so the documentation
recommends we use the imageio library instead. The next code block shows how an image can be read with
the imageio.imread() function and can be displayed with Matplotlib:
Copy
import imageio
im = imageio.imread('../images/pepper.jpg')
print(type(im), im.shape, im.dtype)
# <class 'imageio.core.util.Image'> (225, 225, 3) uint8
plt.imshow(im), plt.axis('off'), plt.show()
https://subscription.packtpub.com/book/big_data_and_business_inte…/9781789343731/1/ch01lvl1sec14/image-i-o-and-display-with-python Page 9 of 10
Image I/O and display with Python - Hands-On Image Processing with Python 03.12.2020, 17:38
The next figure shows the output of the previous code block:
1/1/ch01lvl1sec15/dealing-with-different-image-types-and-file-formats-and-performing-basic-image-manipulations)
https://subscription.packtpub.com/book/big_data_and_business_int…/9781789343731/1/ch01lvl1sec14/image-i-o-and-display-with-python Page 10 of 10
Dealing with different image types and file formats and performin…asic image manipulations - Hands-On Image Processing with Python 03.12.2020, 17:38
File formats
Image files can be of different formats. Some of the popular ones include BMP (8-bit, 24-bit, 32-bit), PNG, JPG
(JPEG), GIF, PPM, PNM, and TIFF. We do not need to be worried about the specific format of an image file (and
how the metadata is stored) to extract data from it. Python image processing libraries will read the image and
extract the data, along with some other useful information for us (for example, image size, type/mode, and data
type).
Copy
im = Image.open("../images/parrot.png")
print(im.mode)
# RGB
im.save("../images/parrot.jpg")
But if the PNG file is in the RGBA mode, we need to convert it into the RGB mode before we save it as JPG,
as otherwise it will give an error. The next code block shows how to first convert and then save:
Copy
https://subscription.packtpub.com/book/big_data_and_business_inte…-types-and-file-formats-and-performing-basic-image-manipulations Page 1 of 29
Dealing with different image types and file formats and performin…asic image manipulations - Hands-On Image Processing with Python 03.12.2020, 17:38
im = Image.open("../images/hill.png")
print(im.mode)
# RGBA
im.convert('RGB').save("../images/hill.jpg") # first convert to RGB mode
( Gray-level images (each pixel can be represented with 8-bits and can have values typically in the range of
0-255)
( Four-channel images; for example, RGBA images—each pixel is represented by three-tuple (r,
r, g, b, α)
values, the last channel representing the transparency.
Copy
im = imread("images/parrot.png", as_gray=True)
print(im.shape)
#(362L, 486L)
https://subscription.packtpub.com/book/big_data_and_business_inte…-types-and-file-formats-and-performing-basic-image-manipulations Page 2 of 29
Dealing with different image types and file formats and performin…asic image manipulations - Hands-On Image Processing with Python 03.12.2020, 17:38
Note that we can lose some information while converting into grayscale for some colored images. The following
code shows such an example with Ishihara plates, used to detect color-blindness. This time, the
rgb2gray() function is used from the color module, and both the color and the grayscale images are
shown side by side. As can be seen in the following figure, the number 8 is almost invisible in the grayscale version:
Copy
im = imread("../images/Ishihara.png")
im_g = color.rgb2gray(im)
plt.subplot(121), plt.imshow(im, cmap='gray'), plt.axis('off')
plt.subplot(122), plt.imshow(im_g, cmap='gray'), plt.axis('off')
plt.show()
The next figure shows the output of the previous code—the colored image and the grayscale image obtained from
it:
https://subscription.packtpub.com/book/big_data_and_business_inte…-types-and-file-formats-and-performing-basic-image-manipulations Page 3 of 29
Dealing with different image types and file formats and performin…asic image manipulations - Hands-On Image Processing with Python 03.12.2020, 17:38
Copy
im = imread("../images/parrot.png")
im_hsv = color.rgb2hsv(im)
plt.gray()
plt.figure(figsize=(10,8))
plt.subplot(221), plt.imshow(im_hsv[...,0]), plt.title('h', size=20), plt.axis('off')
plt.subplot(222), plt.imshow(im_hsv[...,1]), plt.title('s', size=20), plt.axis('off')
plt.subplot(223), plt.imshow(im_hsv[...,2]), plt.title('v', size=20), plt.axis('off')
plt.subplot(224), plt.axis('off')
plt.show()
Similarly, we can convert the image into the YUV color space using the rgb2yuv() function.
https://subscription.packtpub.com/book/big_data_and_business_inte…-types-and-file-formats-and-performing-basic-image-manipulations Page 4 of 29
Dealing with different image types and file formats and performin…asic image manipulations - Hands-On Image Processing with Python 03.12.2020, 17:38
As we have already discussed, PIL uses the Image object to store an image, whereas scikit-image uses
the numpy ndarray data structure to store the image data. The next section describes how to convert
between these two data structures.
Copy
The next figure shows the output of the previous code, which is an image of flowers:
The following code block shows how to convert from numpy ndarray into a PIL Image object. When run,
the code shows the same output as the previous figure:
Copy
https://subscription.packtpub.com/book/big_data_and_business_inte…-types-and-file-formats-and-performing-basic-image-manipulations Page 5 of 29
Dealing with different image types and file formats and performin…asic image manipulations - Hands-On Image Processing with Python 03.12.2020, 17:38
Copy
https://subscription.packtpub.com/book/big_data_and_business_inte…-types-and-file-formats-and-performing-basic-image-manipulations Page 6 of 29
Dealing with different image types and file formats and performin…asic image manipulations - Hands-On Image Processing with Python 03.12.2020, 17:38
Copy
The next figure shows the sequence of the α-blended images created using the previous code by cross-dissolving
Messi's face image into Ronaldo's. As can be seen from the sequence of intermediate images in the figure, the face
morphing with simple blending is not very smooth. In upcoming chapters, we shall see more advanced techniques
for image morphing:
https://subscription.packtpub.com/book/big_data_and_business_inte…-types-and-file-formats-and-performing-basic-image-manipulations Page 7 of 29
Dealing with different image types and file formats and performin…asic image manipulations - Hands-On Image Processing with Python 03.12.2020, 17:38
Copy
The next few sections describe how to do different types of image manipulations with PIL.
Cropping an image
We can use the crop() function with the desired rectangle argument to crop the corresponding area from the
image, as shown in the following code:
Copy
https://subscription.packtpub.com/book/big_data_and_business_inte…-types-and-file-formats-and-performing-basic-image-manipulations Page 8 of 29
Dealing with different image types and file formats and performin…asic image manipulations - Hands-On Image Processing with Python 03.12.2020, 17:38
im_c = im.crop((175,75,320,200)) # crop the rectangle given by (left, top, right, bottom) from the image
im_c.show()
The next figure shows the cropped image created using the previous code:
Resizing an image
In order to increase or decrease the size of an image, we can use the resize() function, which internally up-
samples or down-samples the image, respectively. This will be discussed in detail in the next chapter.
Let us start with a small clock image of a size of 149 x 97 and create a larger size image. The following code snippet
shows the small clock image we will start with:
Copy
im = Image.open("../images/clock.jpg")
print(im.width, im.height)
# 107 105
im.show()
The output of the previous code, the small clock image, is shown as follows:
The next line of code shows how the resize() function can be used to enlarge the previous input clock image
(by a factor of 5) to obtain an output image of a size 25 times larger than the input image by using bi-linear
interpolation (an up-sampling technique). The details about how this technique works will be described in the next
chapter:
Copy
https://subscription.packtpub.com/book/big_data_and_business_inte…-types-and-file-formats-and-performing-basic-image-manipulations Page 9 of 29
Dealing with different image types and file formats and performin…asic image manipulations - Hands-On Image Processing with Python 03.12.2020, 17:38
Now let us do the reverse: start with a large image of the Victoria Memorial Hall (of a size of 720 x 540) and create
a smaller-sized image. The next code snippet shows the large image to start with:
Copy
im = Image.open("../images/victoria_memorial.png")
print(im.width, im.height)
# 720 540
im.show()
The output of the previous code, the large image of the Victoria Memorial Hall, is shown as follows:
The next line of code shows how the resize() function can be used to shrink the previous image of the
Victoria Memorial Hall (by a factor of 5) to resize it to an output image of a size 25 times smaller than the input
image by using anti-aliasing (a high-quality down-sampling technique). We will see how it works in the next
chapter:
Copy
Negating an image
https://subscription.packtpub.com/book/big_data_and_business_int…-types-and-file-formats-and-performing-basic-image-manipulations Page 10 of 29
Dealing with different image types and file formats and performin…asic image manipulations - Hands-On Image Processing with Python 03.12.2020, 17:38
We can use the point() function to transform each pixel value with a single-argument function. We can use it
to negate an image, as shown in the next code block. The pixel values are represented using 1-byte unsigned
integers, which is why subtracting it from the maximum possible value will be the exact point operation required
on each pixel to get the inverted image:
Copy
im = Image.open("../images/parrot.png")
im_t = im.point(lambda x: 255 - x)
im_t.show()
The next figure shows the negative image, the output of the previous code:
Copy
We are going to use this image for the next few gray-level transformations.
Log transformation
https://subscription.packtpub.com/book/big_data_and_business_inte…-types-and-file-formats-and-performing-basic-image-manipulations Page 11 of 29
Dealing with different image types and file formats and performin…asic image manipulations - Hands-On Image Processing with Python 03.12.2020, 17:38
The log transformation can be used to effectively compress an image that has a dynamic range of pixel values. The
following code uses the point transformation for logarithmic transformation. As can be seen, the range of pixel
values is narrowed, the brighter pixels from the input image have become darker, and the darker pixels have
become brighter, thereby shrinking the range of values of the pixels:
Copy
im_g.point(lambda x: 255*np.log(1+x/255)).show()
The next figure shows the output log-transformed image produced by running the previous line of code:
Power-law transformation
This transformation is used as γ correction for an image. The next line of code shows how to use the point()
im_g.point(lambda x: 255*(x/255)**0.6).show()
The next figure shows the output power-law-transformed image produced by running the preceding line of code:
https://subscription.packtpub.com/book/big_data_and_business_int…-types-and-file-formats-and-performing-basic-image-manipulations Page 12 of 29
Dealing with different image types and file formats and performin…asic image manipulations - Hands-On Image Processing with Python 03.12.2020, 17:38
Reflecting an image
We can use the transpose() function to reflect an image with regard to the horizontal or vertical axis:
Copy
The next figure shows the output image produced by running the previous line of code:
Rotating an image
https://subscription.packtpub.com/book/big_data_and_business_int…-types-and-file-formats-and-performing-basic-image-manipulations Page 13 of 29
Dealing with different image types and file formats and performin…asic image manipulations - Hands-On Image Processing with Python 03.12.2020, 17:38
We can use the rotate() function to rotate an image by an angle (in degrees):
Copy
The next figure shows the rotated output image produced by running the preceding line of code:
Applying an A
Affine
ffine transformation on an image
A 2-D Affine transformation matrix, T, can be applied on each pixel of an image (in homogeneous coordinates) to
undergo an Affine transformation, which is often implemented with inverse mapping (warping). An interested
reader is advised to refer to this article (https://sandipanweb.wordpress.com/2018/01/21/recursive-graphics-
bilinear-interpolation-and-image-transformation-in-python/
(https://sandipanweb.wordpress.com/2018/01/21/recursive-graphics-bilinear-interpolation-and-image-
transformation-in-python/)) to understand how these transformations can be implemented (from scratch).
The following code shows the output image obtained when the input image is transformed with a shear transform
matrix. The data argument in the transform() function is a 6-tuple (a, b, c, d, e, f), which contains the first
two rows from an Affi
ffine
ne transform matrix
matrix. For each pixel (x, y) in the output image, the new value is taken from
a position (a x + b y + c, d x + e y + f) in the input image, which is rounded to nearest pixel. The
transform() function can be used to scale, translate, rotate, and shear the original image:
Copy
im = Image.open("../images/parrot.png")
im.transform((int(1.4*im.width), im.height), Image.AFFINE, data=(1,-0.5,0,0,1,0)).show() # shear
https://subscription.packtpub.com/book/big_data_and_business_int…-types-and-file-formats-and-performing-basic-image-manipulations Page 14 of 29
Dealing with different image types and file formats and performin…asic image manipulations - Hands-On Image Processing with Python 03.12.2020, 17:38
The next figure shows the output image with shear transform, produced by running the previous code:
Perspective transformation
Copy
The next figure shows the image obtained after the perspective projection, by running the preceding code block:
https://subscription.packtpub.com/book/big_data_and_business_int…-types-and-file-formats-and-performing-basic-image-manipulations Page 15 of 29
Dealing with different image types and file formats and performin…asic image manipulations - Hands-On Image Processing with Python 03.12.2020, 17:38
We can use the putpixel() function to change a pixel value in an image. Next, let us discuss a popular
application of adding noise to an image using the function.
We can add some salt-and-pepper noise to an image by selecting a few pixels from the image randomly and
then setting about half of those pixel values to black and the other half to white. The next code snippet shows how
to add the noise:
Copy
The following figure shows the output noisy image generated by running the previous code:
Drawing on an image
We can draw lines or other geometric shapes on an image (for example, the ellipse() function to draw an
ellipse) from the PIL.ImageDraw module, as shown in the next Python code snippet:
Copy
im = Image.open("../images/parrot.png")
draw = ImageDraw.Draw(im)
draw.ellipse((125, 125, 200, 250), fill=(255,255,255,128))
del draw
im.show()
https://subscription.packtpub.com/book/big_data_and_business_int…-types-and-file-formats-and-performing-basic-image-manipulations Page 16 of 29
Dealing with different image types and file formats and performin…asic image manipulations - Hands-On Image Processing with Python 03.12.2020, 17:38
The following figure shows the output image generated by running the previous code:
Copy
draw = ImageDraw.Draw(im)
font = ImageFont.truetype("arial.ttf", 23) # use a truetype font
draw.text((10, 5), "Welcome to image processing with python", font=font)
del draw
im.show()
The following figure shows the output image generated by running the previous code:
https://subscription.packtpub.com/book/big_data_and_business_int…-types-and-file-formats-and-performing-basic-image-manipulations Page 17 of 29
Dealing with different image types and file formats and performin…asic image manipulations - Hands-On Image Processing with Python 03.12.2020, 17:38
Creating a thumbnail
We can create a thumbnail from an image with the thumbnail() function, as shown in the following:
Copy
The figure shows the output image generated by running the preceding code snippet:
Copy
https://subscription.packtpub.com/book/big_data_and_business_int…-types-and-file-formats-and-performing-basic-image-manipulations Page 18 of 29
Dealing with different image types and file formats and performin…asic image manipulations - Hands-On Image Processing with Python 03.12.2020, 17:38
Copy
s = stat.Stat(im)
print(s.extrema) # maximum and minimum pixel values for each channel R, G, B
# [(4, 255), (0, 255), (0, 253)]
print(s.count)
# [154020, 154020, 154020]
print(s.mean)
# [125.41305674587716, 124.43517724970783, 68.38463186599142]
print(s.median)
# [117, 128, 63]
print(s.stddev)
# [47.56564506512579, 51.08397900881395, 39.067418896260094]
Plotting the histograms of pixel values for the RGB channels of an image
The histogram() function can be used to compute the histogram (a table of pixel values versus frequencies)
of pixels for each channel and return the concatenated output (for example, for an RGB image, the output contains
3 x 256 = 768 values):
Copy
pl = im.histogram()
plt.bar(range(256), pl[:256], color='r', alpha=0.5)
plt.bar(range(256), pl[256:2*256], color='g', alpha=0.4)
plt.bar(range(256), pl[2*256:], color='b', alpha=0.3)
plt.show()
The following figure shows the R, G, and B color histograms plotted by running the previous code:
Copy
https://subscription.packtpub.com/book/big_data_and_business_int…-types-and-file-formats-and-performing-basic-image-manipulations Page 19 of 29
Dealing with different image types and file formats and performin…asic image manipulations - Hands-On Image Processing with Python 03.12.2020, 17:38
ch_r, ch_g, ch_b = im.split() # split the RGB image into 3 channels: R, G and B
# we shall use matplotlib to display the channels
plt.figure(figsize=(18,6))
plt.subplot(1,3,1); plt.imshow(ch_r, cmap=plt.cm.Reds); plt.axis('off')
plt.subplot(1,3,2); plt.imshow(ch_g, cmap=plt.cm.Greens); plt.axis('off')
plt.subplot(1,3,3); plt.imshow(ch_b, cmap=plt.cm.Blues); plt.axis('off')
plt.tight_layout()
plt.show() # show the R, G, B channels
The following figure shows three output images created for each of the R (red), G (green), and B (blue) channels
generated by running the previous code:
Copy
im = Image.merge('RGB', (ch_b, ch_g, ch_r)) # swap the red and blue channels obtained last time with split()
im.show()
The following figure shows the RGB output image created by merging the B, G, and R channels by running the
preceding code snippet:
https://subscription.packtpub.com/book/big_data_and_business_int…-types-and-file-formats-and-performing-basic-image-manipulations Page 20 of 29
Dealing with different image types and file formats and performin…asic image manipulations - Hands-On Image Processing with Python 03.12.2020, 17:38
If α is 0.0, a copy of the first image is returned. If α is 1.0, a copy of the second image is returned. The next code
snippet shows an example:
Copy
im1 = Image.open("../images/parrot.png")
im2 = Image.open("../images/hill.png")
# 453 340 1280 960 RGB RGBA
im1 = im1.convert('RGBA') # two images have different modes, must be converted to the same mode
im2 = im2.resize((im1.width, im1.height), Image.BILINEAR) # two images have different sizes, must be converted to the s
im = Image.blend(im1, im2, alpha=0.5).show()
The following figure shows the output image generated by blending the previous two images:
https://subscription.packtpub.com/book/big_data_and_business_int…-types-and-file-formats-and-performing-basic-image-manipulations Page 21 of 29
Dealing with different image types and file formats and performin…asic image manipulations - Hands-On Image Processing with Python 03.12.2020, 17:38
Copy
im1 = Image.open("../images/parrot.png")
im2 = Image.open("../images/hill.png").convert('RGB').resize((im1.width, im1.height))
multiply(im1, im2).show()
The next figure shows the output image generated when superimposing two images by running the preceding
code snippet:
https://subscription.packtpub.com/book/big_data_and_business_int…-types-and-file-formats-and-performing-basic-image-manipulations Page 22 of 29
Dealing with different image types and file formats and performin…asic image manipulations - Hands-On Image Processing with Python 03.12.2020, 17:38
The next code snippet shows how an image can be generated by adding two input images (of the same size) pixel
by pixel:
Copy
add(im1, im2).show()
The next figure shows the output image generated by running the previous code snippet:
Copy
plt.subplot(311)
plt.imshow(im1)
plt.axis('off')
plt.subplot(312)
plt.imshow(im2)
plt.axis('off')
plt.subplot(313)
plt.imshow(im), plt.axis('off')
plt.show()
https://subscription.packtpub.com/book/big_data_and_business_int…-types-and-file-formats-and-performing-basic-image-manipulations Page 23 of 29
Dealing with different image types and file formats and performin…asic image manipulations - Hands-On Image Processing with Python 03.12.2020, 17:38
The next figure shows the output of the code, with the consecutive frame images followed by their difference
image:
First frame
Second frame
https://subscription.packtpub.com/book/big_data_and_business_int…-types-and-file-formats-and-performing-basic-image-manipulations Page 24 of 29
Dealing with different image types and file formats and performin…asic image manipulations - Hands-On Image Processing with Python 03.12.2020, 17:38
We can use the SimilarityTransform() function to compute the transformation matrix, followed by
warp() function, to carry out the transformation, as shown in the next code block:
Copy
im = imread("../images/parrot.png")
tform = SimilarityTransform(scale=0.9, rotation=np.pi/4,translation=(im.shape[0]/2, -100))
warped = warp(im, tform)
import matplotlib.pyplot as plt
plt.imshow(warped), plt.axis('off'), plt.show()
The following figure shows the output image generated by running the previous code snippet:
https://subscription.packtpub.com/book/big_data_and_business_int…-types-and-file-formats-and-performing-basic-image-manipulations Page 25 of 29
Dealing with different image types and file formats and performin…asic image manipulations - Hands-On Image Processing with Python 03.12.2020, 17:38
Copy
im = imread("../images/parrot.png")
swirled = swirl(im, rotation=0, strength=15, radius=200)
plt.imshow(swirled)
plt.axis('off')
plt.show()
The next figure shows the output image generated with swirl transformation by running the previous code
snippet:
https://subscription.packtpub.com/book/big_data_and_business_int…-types-and-file-formats-and-performing-basic-image-manipulations Page 26 of 29
Dealing with different image types and file formats and performin…asic image manipulations - Hands-On Image Processing with Python 03.12.2020, 17:38
We can use the random_noise() function to add different types of noise to an image. The next code example
shows how Gaussian noise with different variances can be added to an image:
Copy
im = img_as_float(imread("../images/parrot.png"))
plt.figure(figsize=(15,12))
sigmas = [0.1, 0.25, 0.5, 1]
for i in range(4):
noisy = random_noise(im, var=sigmas[i]**2)
plt.subplot(2,2,i+1)
plt.imshow(noisy)
plt.axis('off')
plt.title('Gaussian noise with sigma=' + str(sigmas[i]), size=20)
plt.tight_layout()
plt.show()
The next figure shows the output image generated by adding Gaussian noises with different variance by running
the previous code snippet. As can be seen, the more the standard deviation of the Gaussian noise, the noisier the
output image:
https://subscription.packtpub.com/book/big_data_and_business_int…-types-and-file-formats-and-performing-basic-image-manipulations Page 27 of 29
Dealing with different image types and file formats and performin…asic image manipulations - Hands-On Image Processing with Python 03.12.2020, 17:38
Copy
https://subscription.packtpub.com/book/big_data_and_business_int…-types-and-file-formats-and-performing-basic-image-manipulations Page 28 of 29
Summary - Hands-On Image Processing with Python 03.12.2020, 17:38
Summary
In this chapter, we first provided a basic introduction to image processing and basic concepts regarding the
problems that we try to solve in image processing. We then discussed different tasks and steps with image
processing, and the leading image processing libraries in Python, which we are going to use for coding in this book.
Next, we talked about how to install different libraries for image processing in Python, and how to import them
and call the functions from the modules. We also covered basic concepts about image types, file formats, and data
structures to store image data with different Python libraries. Then, we discussed how to perform image I/O and
display in Python using different libraries. Finally, we discussed how to perform basic image manipulations with
different Python libraries. In the next chapter, we will deep dive into sampling, quantization, convolution, the
Fourier transform, and frequency domain filtering on images.
https://subscription.packtpub.com/book/big_data_and_business_intelligence/9781789343731/1/ch01lvl1sec16/summary Page 1 of 1