Tips and Tricks of OpenCV cv2.imread() That You Did Not Know

Introduction

cv2.imread() function of OpenCV that is commonly used to read the image from the file. The image is loaded as a numpy array which can be used for further image processing or transformation operations. Although it is quite a straightforward function, but cv2 imread has many features that are not commonly known. In this post, we will give you a detailed explanation of cv2.imread() function of Python OpenCV along with examples. Finally, at the end we will discuss the commonly faced error AttributeError: ‘NoneType’ object has no attribute associated with imread.

Syntax of OpenCV cv2.imread() Function

The syntax of cv2.imread() is as follows –

cv2.imread(filename [, flag])

Parameters

  • filename – Path and name of the image file to be read.
  • flag – This is optional and denotes how the image should be read. The flag values can be one of the following –

[ninja_tables id=”7261″]

File format supported by cv2 imread function

You can read the following file format with imread() function of OpenCV.

[ninja_tables id=”7263″]

Example of cv2.imread() OpenCV Python

Sample Image for Examples

cv2 imread python

For all the examples below we shall be using the above image whose dimension is 399x 625. This image is in png format with transparent background and thus has an alpha channel besides the three blue, red, and green channels. So overall this image has 4 channels.

Importing OpenCV Library

First of all, let us import the OpenCV library as shown below –

In [0]:

import cv2

Example 1 – Reading Image with Default Flag Value

In the first example, we read the sample image with imread() function without passing any other flag value. After reading the image its details are printed and we can observe that it is showing 3 channels (for BGR channels) instead of 4 in the actual image.

This is because here the default value of the flag is used as cv2.IMREAD_COLOR which has removed the alpha channel.

In [1]:

#read image
img=cv2.imread("animals.png")

print('Image Dimension is',img.shape)
print('Image Height is',img.shape[0])
print('Image Width is',img.shape[1])
print('Number of Channels is',img.shape[2])

Out[1]:

Image Dimension is (399, 625, 3)
Image Height is 399
Image Width is 625
Number of Channels is 3

 

Example 2 – Reading Image with Flag Value cv2.IMREAD_COLOR

Next, we use the flag value as cv2.IMREAD_COLOR and it can be seen that it gives the number of channels as 3 (same output as 1st example). Thus it validates the fact alpha channel gets removed with flag value cv2.IMREAD_COLOR which also happens to be the default flag value.

In [2]:

#read image
img=cv2.imread("animals.png")

print('Image Dimension is',img.shape)
print('Image Height is',img.shape[0])
print('Image Width is',img.shape[1])
print('Number of Channels is',img.shape[2])

Out[2]:

Image Dimension is (399, 625, 3)
Image Height is 399
Image Width is 625
Number of Channels is 3

 

Example 3 – imread() with Flag Value cv2.IMREAD_UNCHANGED

cv2.IMREAD_UNCHANGED ensures that cv2.imread reads the image as it is and even preserves the alpha channel. It can be seen that number of channels is 4 this time in the below output.

In [3]:

#read image
img=cv2.imread("animals.png", cv2.IMREAD_UNCHANGED )

print('Image Dimension is',img.shape)
print('Image Height is',img.shape[0])
print('Image Width is',img.shape[1])
print('Number of Channels is',img.shape[2])

Out[3]:

Image Dimension is (399, 625, 4)
Image Height is 399
Image Width is 625
Number of Channels is 4

 

Example 4 – imread() with Flag Value cv2.IMREAD_GRAYSCALE

The flag value of cv2.IMREAD_GRAYSCALE enables imread() function to read the image in grayscale.

In the output of the below example, there is no channel as the image is read in grayscale.

In [4]:

#read image
img=cv2.imread(filename, cv2.IMREAD_GRAYSCALE)

print('Image Dimension is',img.shape)
print('Image Height is',img.shape[0])
print('Image Width is',img.shape[1])

Out[4]:

Image Dimension is (399, 625)
Image Height is 399
Image Width is 625

 

Example 5 – Using Flag Value cv2.IMREAD_REDUCED_COLOR_2

cv2.IMREAD_REDUCED_COLOR_2 reads the image in BGR format and also reduces the image size by half. The same can be seen in the below example where the dimension of the image has become 199×312 from the original image 399×625.

In [5]:

#read image
img=cv2.imread("animals.png", cv2.IMREAD_REDUCED_COLOR_2 )

print('Image Dimension is',img.shape)
print('Image Height is',img.shape[0])
print('Image Width is',img.shape[1])
print('Number of Channels is',img.shape[2])

Out [5]:

Image Dimension is (199, 312, 3)
Image Height is 199
Image Width is 312
Number of Channels is 3

 

Example 6 – Using Flag Value cv2.IMREAD_REDUCED_COLOR_4

cv2.IMREAD_REDUCED_COLOR_2 reads the image in BGR format and also reduces the image size by one-fourth.

In the below example, the image is reduced to 99×156 which is one-fourth of the original image.

In [6]:

#read image
img=cv2.imread("animals.png", cv2.IMREAD_REDUCED_COLOR_4 )

print('Image Dimension is',img.shape)
print('Image Height is',img.shape[0])
print('Image Width is',img.shape[1])
print('Number of Channels is',img.shape[2])

Out [6]:

Image Dimension is (99, 156, 3)
Image Height is 99
Image Width is 156
Number of Channels is 3

Example 7 – Using Flag Value cv2.IMREAD_REDUCED_COLOR_8

cv2.IMREAD_REDUCED_COLOR_8 reads the image in BGR format and also reduces the image size by one-eight.

In the below example, the image is reduced to 49×78 which is one-eighth of the original image.

In [7]:

#read image
img=cv2.imread("animals.png", cv2.IMREAD_REDUCED_COLOR_8 )

print('Image Dimension is',img.shape)
print('Image Height is',img.shape[0])
print('Image Width is',img.shape[1])
print('Number of Channels is',img.shape[2])

Out [7]:

Image Dimension is (49, 78, 3)
Image Height is 49
Image Width is 78
Number of Channels is 3

 

Example 8 – Flag Value cv2.IMREAD_REDUCED_GRAYSCALE_2

cv2.IMREAD_REDUCED_GRAYSCALE_2 flag value reads the image in grayscale and reduces the image by half while loading it.

In the below example, the image is loaded in grayscale, and the image size has been reduced to 199×312 which is half of the original.

In [8]:

img=cv2.imread("animals.png", cv2.IMREAD_REDUCED_GRAYSCALE_2 )

print('Image Dimension is',img.shape)
print('Image Height is',img.shape[0])
print('Image Width is',img.shape[1])

Out[8]:

Image Dimension is (199, 312)
Image Height is 199
Image Width is 312

Example 9 – Flag Value cv2.IMREAD_REDUCED_GRAYSCALE_4

cv2.IMREAD_REDUCED_GRAYSCALE_4 flag value reads the image in grayscale and reduces the image size to one-fourth while loading it.

In the below example, the image is loaded in grayscale, and the image size has been reduced to 99×156 which is one-fourth of the original.

In [9]:

img=cv2.imread("animals.png", cv2.IMREAD_REDUCED_GRAYSCALE_4 )

print('Image Dimension is',img.shape)
print('Image Height is',img.shape[0])
print('Image Width is',img.shape[1])

Out[9]:

Image Dimension is (99, 156)
Image Height is 99
Image Width is 156

 

Example 10 – Flag Value cv2.IMREAD_REDUCED_GRAYSCALE_8

cv2.IMREAD_REDUCED_GRAYSCALE_8 flag value reads the image in grayscale and reduces the image size to one-eight while loading it.

In the below example, the image is loaded in grayscale, and the image size has been reduced to 49×78 which is one-eighth of the original.

In [10]:

img=cv2.imread("animals.png", cv2.IMREAD_REDUCED_GRAYSCALE_8 )

print('Image Dimension is',img.shape)
print('Image Height is',img.shape[0])
print('Image Width is',img.shape[1])

Out[10]:

Image Dimension is (49, 78)
Image Height is 49
Image Width is 78

 

cv2.imread() Pitfall Alert –  attributeerror: ‘nonetype’ object has no attribute

It is very common for beginners who get frustrated with the error attributeerror: ‘nonetype’ object has no attribute and they are unable to resolve it only to realize after hours that they passed the wrong image filename or path to imread function.

Yes!  imread function does not throw any error if the filename is wrong, but the moment you try to perform some operations at the subsequent steps, you start seeing errors of type attributeerror: ‘nonetype’ object has no attribute leaving you confused.

Let us dig down more into it. cv2.imread() creates an object of numpy.ndarray type if it reads an image successfully as shown below.

In [11]:

#read image
img=cv2.imread("animals.png")

type(img)

Out[11]:

numpy.ndarray

But when we try to read an incorrect image filename or path, imread creates an object of NoneType but does not give any error to indicate that the file name or path is incorrect.

In [12]:

#read image
img=cv2.imread("doesnotexist.png")

type(img)

Out[12]:

NoneType

And now, if you try to perform any operation on it subsequently you will start getting errors. For example, if you try to get the shape, you will get the error AttributeError: ‘NoneType’ object has no attribute ‘shape’

In [13]:

img.shape

Out[13]:

---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
<ipython-input-23-32ad6cb7aa56> in <module>
----> 1 img.shape

AttributeError: 'NoneType' object has no attribute 'shape'

 

 

Reference – OpenCV Documentation

Follow Us

Leave a Reply

Your email address will not be published. Required fields are marked *