\[ \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}} % % Temperature \newcommand\kelvin{\unit{K}} \newcommand\K{\kelvin} \newcommand\celsius{\unit{{}^\circ C}} \newcommand\C{\celsius} \newcommand\fahrenheit{\unit{{}^\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} \]

Dec 04, 2025 | 811 words | 8 min read

11.2.1. Task 1#

Learning Objectives#

  • Load a user specified image as an array and display it.

Task Instructions#

Save the flowcharts for this task in tp1_team_1_teamnumber.pdf You will also need to include these flowcharts in your final report.

Write Python code that loads a user specified image and prepares it for feature extraction. Ensure that the image is converted to the correct format (RGB or Grayscale) and the pixel values are properly scaled for processing. If the image is in RGBA mode, convert it to RGB before returning it as a 3 channel NumPy array. If the image is in Grayscale mode, return it as a single channel NumPy array.

For this checkpoint, please revisit Section 10.1.1 and read the documentation links thoroughly. You will need to use the PIL library to load and manipulate images, and the matplotlib.pyplot library to display images.

Name this program tp1_team_1_teamnumber.py.

Step 1: Image Loading Function#

Create a function named load_img

Arguments:

  • path (str): The file path of the image to be loaded

Returns:

  • img_array (NumPy array): The NumPy array representing the normalized RGB/Grayscale image

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

Color images should have 3 channels (Red, Green, Blue), while grayscale images should have only one channel. For this, you must check the shape of each image, if the format is RGBA, discard the 4th channel to make it RGB. After conversion, 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 values, either as integers in the range [0-255] or normalized floating-point values [0.0-1.0]. For feature extraction in checkpoint 2, you need pixel values to be integers in the range [0-255].

For this task, your function should first normalize all pixels so that the values are between [0.0-1.0] (if not already in this range). Next, linearize the pixel intensities as you did in Section 10.3.1. That is, for each pixel, apply the following transformation:

(11.1)#\[\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}\]

Note

RGB images need each channel (R, G, B) of each pixel to be linearized separately. Grayscale images only have one channel to linearize.

For feature extraction in the next tasks, you need pixel values to be integers in the range [0-255].

So, scale them back to the range [0-255] and set the data type to unsigned 8-bit integers (np.uint8, see the docs). You can read about some different NumPy data types here

Hint

You can check the data type of a NumPy array using the .dtype attribute. For example, if arr is a NumPy array, you can get its data type by accessing arr.dtype.

Ask a TA or ChatGPT: Why do we want to scale values to 0-255 to store them as 8-bit integers?

Step 2: Grayscale Conversion Function#

Create a function named rgb_to_grayscale

Arguments:

  • img_array (NumPy array): The NumPy array representing the loaded RGB image

Returns:

  • gray_array (NumPy array): The NumPy array representing the Grayscale image after conversion

The function should use the ITU-R Recommendation BT.709 standard for grayscale conversion:

\(Y = 0.2126 \times R + 0.7152 \times G + 0.0722 \times B\)

Here, \(Y\) is the resulting grayscale intensity, and \(R\), \(G\), and \(B\) are the linearized values of the red, green, and blue channels, respectively. The weights correspond to the relative importance of each channel in human vision.

Note

You may need to change the data type of the input array to floating-point to avoid overflow during calculations. After computing the grayscale intensity values, ensure that the output is converted back to unsigned 8-bit integers.

Be sure to apply this formula to each pixel in the image array to produce the grayscale output.

Ensure that the grayscale result is stored as unsigned 8-bit integers in the range [0, 255]. Note that the array this function returns should only have 2 dimensions (height, width) since it is a single channel 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 it to grayscale.

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

Note

Grayscale images are displayed back 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 11.3 to test your code.

Table 11.3 Image Files#

Image File Name

Description

ref_col.png

A color image

ref_gry.png

A grayscale image

Ensure that your outputs match the examples below.

Sample Output#

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

Table 11.4 Test Cases#

Case

image_path

1

ref_col.png

2

ref_gry.png

3

ref_col.png

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 tp1_team_1_teamnumber.py Enter the path of the image you want to load: ref_col.png Would you like to convert to grayscale? no

Case_1_output_ref_col.png

Fig. 11.1 Case_1_output_ref_col.png#

Case 2 Sample Output

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

Case_2_output_gray_ref_gry.png

Fig. 11.2 Case_2_output_gray_ref_gry.png#

Case 3 Sample Output

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

Case_3_output_gray_ref_col.png

Fig. 11.3 Case_3_output_gray_ref_col.png#

Table 11.5 Deliverables#

Deliverables

Description

tp1_team_1_teamnumber.pdf

Flowchart(s) for this task.

tp1_team_1_teamnumber.py

Your completed Python code.