\[ \begin{align}\begin{aligned}\newcommand\blank{~\underline{\hspace{1.2cm}}~}\\% Bold symbols (vectors) \newcommand\bs[1]{\mathbf{#1}}\\% 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{\%}} % % Angle \newcommand\radian{\unit{rad}} \newcommand\degree{\unit{{}^\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 % % 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} \]

Oct 24, 2024 | 330 words | 3 min read

9.2.2. Task 2#

Learning Objectives#

  • Extract a binary message from an image using the Least Significant Bit (LSB) technique.

Task Instructions#

Save the flowcharts for each of your tasks in tp1_team_teamnumber.pdf You will also need to include these flowcharts in your final report.

Write Python code that will extract binary data from the Least Significant Bit (LSB) of each pixel’s value in an image. This binary data contains a hidden message. Name this program tp1_team_2_teamnumber.py. Utilize the code you wrote in Task 1 to import and scale the image data before processing.

  1. The encoded message starts and ends with specific sequences (provided in text form). Converts these sequences from text to binary to match the binary format used in the image. You may want to write a function to do this conversion.

  2. Starting from the upper left corner, and proceeding left to right across the image, and then top to bottom down the image, extract each pixel’s LSB(s). If the pixel is a color image, extract the LSBs from each color channel, first Red, then Green, and finally Blue. Concatenate the LSBs to form a single binary string.

  3. The LSB values between the start and end sequence contain our hidden message. Locate the start and end sequences in the binary data to extract and display the bits in between. If the start or end sequence is not found, print and error message.

Organize your code to use functions that break up the task into manageable pieces. Use the files provided in the Table 9.16 to test your code.

Table 9.16 Image Files#

Image File Name

Description

ref_col_p.png

A color image with a hidden message

ref_gry_p.png

A grayscale image with a hidden message

Sample Output#

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

Table 9.17 Test Cases#

Case

image_path

start_seq

end_seq

1

ref_col_p.png

007

700

2

ref_gry_p.png

007

700

3

ref_gry_p.png

000

777

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_2_teamnumber.py Enter the path of the image you want to load: ref_col_p.png Enter the start sequence: 007 Enter the end sequence: 700 Extracted Message: 0100110001010101010000110100101101011001

Case 2 Sample Output

$ python3 tp1_team_2_teamnumber.py Enter the path of the image you want to load: ref_gry_p.png Enter the start sequence: 007 Enter the end sequence: 700 Extracted Message: 0100100001000101010011000100110001001111

Case 3 Sample Output

$ python3 tp1_team_2_teamnumber.py Enter the path of the image you want to load: ref_gry_p.png Enter the start sequence: 000 Enter the end sequence: 777 Start or end sequence not found in the image.