\[ \begin{align}\begin{aligned}\newcommand\blank{~\underline{\hspace{1.2cm}}~}\\% Bold symbols (vectors) \newcommand\bs[1]{\mathbf{#1}}\\% Differential \newcommand\dd[2][]{\mathrm{d}^{#1}{#2}} % use as \dd, \dd{x}, or \dd[2]{x}\\% Poor man's siunitx \newcommand\unit[1]{\mathrm{#1}} \newcommand\num[1]{#1} \newcommand\qty[2]{#1~\unit{#2}}\\\newcommand\per{/} \newcommand\squared{{}^2} \newcommand\cubed{{}^3} % % Scale \newcommand\milli{\unit{m}} \newcommand\centi{\unit{c}} \newcommand\kilo{\unit{k}} \newcommand\mega{\unit{M}} % % Percent \newcommand\percent{\unit{{\kern-4mu}\%}} % % Angle \newcommand\radian{\unit{rad}} \newcommand\degree{\unit{{\kern-4mu}^\circ}} % % Time \newcommand\second{\unit{s}} \newcommand\s{\second} \newcommand\minute{\unit{min}} \newcommand\hour{\unit{h}} % % Distance \newcommand\meter{\unit{m}} \newcommand\m{\meter} \newcommand\inch{\unit{in}} \newcommand\foot{\unit{ft}} % % Force \newcommand\newton{\unit{N}} \newcommand\kip{\unit{kip}} % kilopound in "freedom" units - edit made by Sri % % Mass \newcommand\gram{\unit{g}} \newcommand\g{\gram} \newcommand\kilogram{\unit{kg}} \newcommand\kg{\kilogram} \newcommand\grain{\unit{grain}} \newcommand\ounce{\unit{oz}} \newcommand\pound{\unit{lbs}} % % Temperature \newcommand\kelvin{\unit{K}} \newcommand\K{\kelvin} \newcommand\celsius{\unit{{\kern-4mu}^\circ C}} \newcommand\C{\celsius} \newcommand\fahrenheit{\unit{{\kern-4mu}^\circ F}} \newcommand\F{\fahrenheit} % % Area \newcommand\sqft{\unit{sq\,\foot}} % square foot % % Volume \newcommand\liter{\unit{L}} \newcommand\gallon{\unit{gal}} % % Frequency \newcommand\hertz{\unit{Hz}} \newcommand\rpm{\unit{rpm}} % % Voltage \newcommand\volt{\unit{V}} \newcommand\V{\volt} \newcommand\millivolt{\milli\volt} \newcommand\mV{\milli\volt} \newcommand\kilovolt{\kilo\volt} \newcommand\kV{\kilo\volt} % % Current \newcommand\ampere{\unit{A}} \newcommand\A{\ampere} \newcommand\milliampereA{\milli\ampere} \newcommand\mA{\milli\ampere} \newcommand\kiloampereA{\kilo\ampere} \newcommand\kA{\kilo\ampere} % % Resistance \newcommand\ohm{\Omega} \newcommand\milliohm{\milli\ohm} \newcommand\kiloohm{\kilo\ohm} % correct SI spelling \newcommand\kilohm{\kilo\ohm} % "American" spelling used in siunitx \newcommand\megaohm{\mega\ohm} % correct SI spelling \newcommand\megohm{\mega\ohm} % "American" spelling used in siunitx % % Capacitance \newcommand\farad{\unit{F}} \newcommand\F{\farad} \newcommand\microfarad{\micro\farad} \newcommand\muF{\micro\farad} % % Inductance \newcommand\henry{\unit{H}} \newcommand\H{\henry} \newcommand\millihenry{\milli\henry} \newcommand\mH{\milli\henry} % % Power \newcommand\watt{\unit{W}} \newcommand\W{\watt} \newcommand\milliwatt{\milli\watt} \newcommand\mW{\milli\watt} \newcommand\kilowatt{\kilo\watt} \newcommand\kW{\kilo\watt} % % Energy \newcommand\joule{\unit{J}} \newcommand\J{\joule} % % Composite units % % Torque \newcommand\ozin{\unit{\ounce}\,\unit{in}} \newcommand\newtonmeter{\unit{\newton\,\meter}} % % Pressure \newcommand\psf{\unit{psf}} % pounds per square foot \newcommand\pcf{\unit{pcf}} % pounds per cubic foot \newcommand\pascal{\unit{Pa}} \newcommand\Pa{\pascal} \newcommand\ksi{\unit{ksi}} % kilopound per square inch \newcommand\bar{\unit{bar}} \end{aligned}\end{align} \]

Apr 28, 2026 | 680 words | 7 min read

15.2.2. Task 2#

Learning Objectives#

  • Load and preprocess digital images using Python libraries

  • Convert and display images in RGB and Grayscale formats

Task Instructions#

Write Python code that loads a user specified image, optionally converts the image to Grayscale, and then displays the image. Ensure that the image is converted to the correct format (RGB or Grayscale) and that the pixel values are properly scaled for processing.

For this assignment, please revisit Section 15.1.1 and read the documentation thoroughly. You will need to use the PIL, numpy, and matplotlib.pyplot libraries to load and manipulate images, manipulate image arrays, and display images respectively.

Before creating the program, create a flowchart of the algorithm you will use and save it as py5_team_2_teamnumber.pdf. Then start your program from a copy of the ENGR133_Python_Template.py Python template. Name this program py5_team_2_teamnumber.py.

Step 1: Image Loading Function#

Create a function named load_img that takes in the file path of the image to be loaded and returns the NumPy array representing the linearized image.

Your function must load the user specified image using PIL.image.open and convert it to an array as you did in Section 15.1.2.

Color images should have \(3\) channels (Red, Green, Blue), while grayscale images should have only one channel. In order to do this, you must check the shape of loaded image. If the format of the image is RGBA (a color image with Red, Green, Blue, and Alpha channels), the 4th channel is to be discarded to convert the image to RGB. Now that the image is in an accepted format (RGB/Grayscale), you must ensure that the pixel values are properly scaled for processing as described below.

Images are typically loaded in a format that represents each pixel’s value either by using integers in the range \([0, 255]\) (most commonly) or normalized floating-point values \([0.0, 1.0]\). Your function should normalize all pixels so that the values are between \([0.0, 1.0]\) (if not already in this range).

As in Section 15.1.2, you must linearize the normalized pixel values to remove the gamma encoding. This is done using the following transfer function where \(C\) represents the channel value (for each channel). The function applies one formula for lower values and another for higher values. For more background, see the sRGB article on Wikipedia.

(15.2)#\[\begin{split}C = \begin{cases} C' / 12.92, & C' \le 0.04045 \\ \left(\frac{C' + 0.055}{1.055}\right)^{2.4}, & C' > 0.04045 \end{cases}\end{split}\]

Step 2: Grayscale Conversion Function#

Create a function named rgb_to_grayscale that takes in a NumPy array representing the linearized RGB image and returns a NumPy array representing the Grayscale converted image.

This function should use the ITU-R Recommendation BT.709 standard for Grayscale conversion:

(15.3)#\[Y = 0.2126 \times R + 0.7152 \times G + 0.0722 \times B\]

Here, \(Y\) is the resulting Grayscale pixel value, and \(R\), \(G\), and \(B\) are the linearized values of the red, green, and blue channels, respectively. These weights were determined by the relative importance and sensitivity of each channel in human vision.

Be sure to apply this formula to each pixel in the image array and that the returned array only has \(2\) dimensions (height, width), as is expected of a Grayscale image.

Step 3: Main Function#

In your main function:

  1. Ask the user for an image file path. Then, call the load_img function with the path to load the image into an array.

  2. After loading the image, if the image is a color image, ask the user if they wish to convert it to Grayscale. If yes, call the rgb_to_grayscale function to convert the image array to Grayscale.

  3. Display the image to the user (see the docs).

Note

Grayscale images are displayed with a colormap by default. You can use the cmap argument in the imshow function to display it correctly. Read more about cmap in the docs.

Organize your code to use functions as explained above to break up the task into manageable pieces. Use the files provided in the Table 15.5 to test your code.

Table 15.5 Image Files#

Image File Name

Description

ref_col.png

A color image

ref_rgba.png

A RGBA image

ref_gry.png

A grayscale image

Ensure that your outputs match the examples below.

Sample Output#

Use the values in Table 15.6 below to test your program.

Table 15.6 Test Cases#

Case

image_path

convert

1

ref_rgba.png

no

2

ref_gry.png

3

ref_col.png

yes

Ensure your program’s output matches the provided samples exactly. This includes all characters, white space, and punctuation. In the samples, user input is highlighted like this for clarity, but your program should not highlight user input in this way.

Case 1 Sample Output

$ python3 py5_team_2_teamnumber.py Enter the path of the image you want to load: ref_rgba.png Would you like to convert to grayscale? no

output ref rgba

Fig. 15.5 Case_1_output_ref_rgba.png#

Case 2 Sample Output

$ python3 py5_team_2_teamnumber.py Enter the path of the image you want to load: ref_gry.png

output ref gry

Fig. 15.6 Case_2_output_ref_gry.png#

Case 3 Sample Output

$ python3 py5_team_2_teamnumber.py Enter the path of the image you want to load: ref_col.png Would you like to convert to grayscale? yes

output gray ref col

Fig. 15.7 Case_3_output_gray_ref_col.png#

Table 15.7 Deliverables#

Deliverables

Description

py5_team_2_teamnumber.pdf

Flowchart(s) for this task.

py5_team_2_teamnumber.py

Your completed Python code.