Digital Image Manipulation -2012 CS4HS @ UCA References: • Introduction to computing and programming in Python – a multimedia approach by Mark Guzdial and Barbara Ericson • JES: Jython Environment for Students, http://code.google.com/p/mediacomp-jes/ • http://nifty.stanford.edu/2011/parlante-image-puzzle/ by Nick Parlante Outline of tasks 0. JES Introduction 1. Load and investigate details of an image 2. Alternate pixel RGB values 3. Solve image puzzles 4. Embed information in a picture 5. Fix the Temple of Hephaestus virtually 6. Land Mark on the moon 7/10/2012 2012 CS4HS @ UCA 2 Outline of tasks 0. JES Introduction: 1. Load and investigate details of an image 2. Alternate pixel RGB values 3. Solve image puzzles 4. Embed information in a picture 5. Fix the Temple of Hephaestus virtually 6. Land Mark on the moon 7/10/2012 2012 CS4HS @ UCA 3 JES: Jython Environment for Students • JES has a set of functions to manipulate media data (digital image and sounds) • Let us open the environment 7/10/2012 2012 CS4HS @ UCA 4 JES 4.3 7/10/2012 2012 CS4HS @ UCA 5 7/10/2012 2012 CS4HS @ UCA 6 Outline of tasks 0. JES Introduction: 1. Load and investigate details of an image 2. Alternate pixel RGB values 3. Solve image puzzles 4. Embed information in a picture 5. Fix the Temple of Hephaestus virtually 6. Land Mark on the moon 7/10/2012 2012 CS4HS @ UCA 7 Pack a file to work with 7/10/2012 2012 CS4HS @ UCA 8 Let us pick the beach.jpg 7/10/2012 2012 CS4HS @ UCA 9 Let the computer remember it • Assign a name to the file we can then refer and use it later. myFile = pickAFile() 7/10/2012 2012 CS4HS @ UCA 10 View the picture • Let us make myFile an picture object myPict = makePicture(myFile) • Does print myPict work? print(myPict) • View myPict with show(myPict) 7/10/2012 2012 CS4HS @ UCA 11 Make a function: pick and show • We do not want to repeatedly type the same commands to load and show a picture every time • Let us create it once and be able to use it whenever needed 7/10/2012 2012 CS4HS @ UCA 12 pickAndShow() 7/10/2012 2012 CS4HS @ UCA 13 Let us save it • File -> Save Program • Specify the location (your USB drive), and give it a name (say prog1) • Exit JES • Open JES again • File -> Open Program • Select prog1 • It comes back 7/10/2012 2012 CS4HS @ UCA 14 Load program and use it • Click “Load Program” • Then, in the command line area type pict1 = pickAndShow() pict2 = pickAndShow() 7/10/2012 2012 CS4HS @ UCA 15 7/10/2012 2012 CS4HS @ UCA 16 Investigate the details • Now let us investigate the details of a digital picture • Pick “MediaTools” from the menu bar, then select “Picture Tool …” 7/10/2012 2012 CS4HS @ UCA 17 (0, 0) (639, 0) x y (639, 479) (0, 479) 7/10/2012 2012 CS4HS @ UCA 18 Outline of tasks 0. JES Introduction: 1. Load and investigate details of an image 2. Alternate pixel RGB values 3. Solve image puzzles 4. Embed information in a picture 5. Fix the Temple of Hephaestus virtually 6. Land Mark on the moon 7/10/2012 2012 CS4HS @ UCA 19 Get a pixel and find its color value 7/10/2012 2012 CS4HS @ UCA 20 Change color value of a pixel 7/10/2012 2012 CS4HS @ UCA 21 Image manipulation • It is all about changing color values of pixels • The process should be: – get a specific pixel first, and – then reset its color. • Do we want to type all the command lines above for every pixel again and again? – The picture has 640 x 480 = 307,200 pixels. • How should we do it? • For example, how do we zero out red values for all pixels? 7/10/2012 2012 CS4HS @ UCA 22 JES Functions • JES Functions -> Pictures -> getPixels • By using the function getPixels, we can get all pixels at once. • We then loop through each pixel to zero out its red value. • Let us open our prog1 and create another function named ZeroRed 7/10/2012 2012 CS4HS @ UCA 23 7/10/2012 2012 CS4HS @ UCA 24 Now let us use it • • • • Load Program Pick a picture Zero red out for all pixels in the picture View the changes with Picture Tool … 7/10/2012 2012 CS4HS @ UCA 25 Work with the pictureModule • We provide you a collection of functions in the pictureModule.py • Open and load the module • Here are some available functions: – pickAndShow() – changeRed( pict, alpha ) – changeGreen( pict, alpha ) – changeBlue( pict, alpha ) – …… 7/10/2012 2012 CS4HS @ UCA 26 chageRed(pict, alpha) def changeRed( pict, alpha ): allPixels = getPixels( pict ) for p in allPixels: value = alpha * getRed( p ) if value > 255: value = 255 setRed( p, value) 7/10/2012 2012 CS4HS @ UCA 27 Change values of Green and Blue • changeGreen( pict, alpha) • changeBlue ( pict, alpha) 7/10/2012 2012 CS4HS @ UCA 28 Outline of tasks 0. JES Introduction: 1. Load and investigate details of an image 2. Alternate pixel RGB values 3. Solve image puzzles 4. Embed information in a picture 5. Fix the Temple of Hephaestus virtually 6. Land Mark on the moon 7/10/2012 2012 CS4HS @ UCA 29 Solve a puzzle • Load the image copper-puzzel.png pic = pickAndShow() • A picture is hidden in. • Let’s find it? 7/10/2012 2012 CS4HS @ UCA 30 Solution 1. Zero out redness 2. Increase greenness 20 times for all pixels 3. Increase the blueness 20 times for all pixels 7/10/2012 2012 CS4HS @ UCA 31 Solve two more puzzles • iron-puzzle.png, and Hint: Increase redness 15 times for all pixels • canvas.png Hint: Increase blueness 16 times 7/10/2012 2012 CS4HS @ UCA 32 How do we create a puzzle? • Zero out R, G, or B • Weak the remaining color • Add randomly generated values for the zero out color 7/10/2012 2012 CS4HS @ UCA 33 Outline of tasks 0. JES Introduction: 1. Load and investigate details of an image 2. Alternate pixel RGB values 3. Solve image puzzles 4. Embed information in a picture 5. Fix the Temple of Hephaestus virtually 6. Land Mark on the moon 7/10/2012 2012 CS4HS @ UCA 34 Hiding a message in a picture (steganography) A scenic picture (original) 7/10/2012 This picture with a hidden message 2012 CS4HS @ UCA 35 7/10/2012 2012 CS4HS @ UCA 36 Problem specification • Inputs: – A cover image – A message • Outputs: – An image seems exactly as the original but with the message embedded – From the image, one can recover the embedded message 7/10/2012 2012 CS4HS @ UCA 37 Solution design • To embed the message, we need to identify the position of each pixel of the message and remember them. • To remember the position of a pixel, we only need to change the original very little such that the altered image seem exactly as the original • When we need to reveal the message, we only need to print the pixels at the positions remembered. 7/10/2012 2012 CS4HS @ UCA 38 Solution design continue • To identify the position of each pixel of the message, we check if a pixel is close to black (or whatever color the text is). • To remember the position of a pixel, we do the followings: – Preparation: Make the red (or green, blue) value of each pixel even. – Memorization: For each message pixel, add one to the red value (become odd now). – Note: These two steps change the original very little • To reveal the message, we only need to print the pixels whose red value is odd. 7/10/2012 2012 CS4HS @ UCA 39 Implementation: encode def stegano(msgPic, coverPic): for pxl in getPixels(coverPic): r = getRed(pxl) if r%2 ==1: setRed(pxl, r-1) for x in range(1, getWidth(coverPic)): for y in range(1, getHeight(coverPic)): msgPxl = getPixel(msgPic, x, y) coverPxl = getPixel(coverPic, x, y) if distance(getColor(msgPxl), black) < 100.0: setRed(coverPxl, getRed(coverPxl) +1) return coverPic 7/10/2012 2012 CS4HS @ UCA 40 Implementation: decode def deStega(segaPic): w = getWidth(segaPic) h = getHeight(segaPic) msg = makeEmptyPicture(w, h) for x in range(0,w): for y in range(0, h): encPxl = getPixel(segaPic, x, y) msgPxl = getPixel(msg, x, y) if (getRed(encPxl)%2) ==1: setColor(msgPxl, black) show(msg) return msg 7/10/2012 2012 CS4HS @ UCA 41 Integration and maintenance • The application should be either to encode a message in a cover image or discover the message from an encoded image. • For the former, we need to pick a cover image, then a message as an image. Then, encode it. • For the later, we need to recover the message from its cover image. 7/10/2012 2012 CS4HS @ UCA 42 Let us do it • Open and load the pictureModule • Load two pictures, one is the cover image and the other is the text image, with coverPic = pickAndShow() msg = pickAndShow() • Embed the message in the cover image secret = stegano (coverPic, msg) • Save it with JES Functions -> Pictures -> writePictureTo • Note: use the .png extension not .jpg 7/10/2012 2012 CS4HS @ UCA 43 Recover the message • Load the picture that you just saved pic = pickAndShow() • The, decipher it with deStega(pic) 7/10/2012 2012 CS4HS @ UCA 44 Outline of tasks 0. JES Introduction: 1. Load and investigate details of an image 2. Alternate pixel RGB values 3. Solve image puzzles 4. Embed information in a picture 5. Fix the Temple of Hephaestus virtually 6. Land Mark on the moon 7/10/2012 2012 CS4HS @ UCA 45 Let us fix the temple in Athens • What is the problem specification? • How do we design a solution? • Implement it • Test and refine the computational solution 7/10/2012 2012 CS4HS @ UCA 46 How do we fix it? • Due the symmetry, we may flip the left half to the right • How do we do it? 7/10/2012 2012 CS4HS @ UCA 47 Try to fix it with reflection 7/10/2012 2012 CS4HS @ UCA 48 Mirroring a picture -vertically 7/10/2012 2012 CS4HS @ UCA 49 Specification • The center line is x = midpoint = width/2. • The x-coordinate of a pixel on the left half is: width/2 - offset • The x-coordinate of a pixel on the right half is: width/2 + offset 7/10/2012 2012 CS4HS @ UCA 50 Further specification - symmetrically reflecting from left to right • Stay on the same row, i. e., the value of y does not change • The x-distance to the center should be the same • We need to get the color value of a pixel at (midpoint – offset, y) and assign it to the pixel located at (midpoint + offset, y) 7/10/2012 2012 CS4HS @ UCA 51 Design: • For a given row, fixed y, loop with offset from 1 to width/2: – Get the left pixel at (midpoint – offset, y) lpixel = getPixel(pic, midpoint – offset, y) – Get the color value of left pixel color = getColor(lpixel) – Get the mirror (right) pixel (midpoint + offset, y) rpixel = getPixel(pic, midpoint + offset, y) – Make the color of right pixel the same as the color of the left pixel setColor(rpixel, color) • The above operation mirrors one row, we need to do it for every row. Hence, we should loop y from 1 to height) 7/10/2012 2012 CS4HS @ UCA 52 Implementation def mirrorLR(pic): #mirror a picture from left to right midpoint = getWidth(pic)/2 for y in range(0, getHeight(pic)): for offset in range(1, midpoint): lpixel = getPixel(pic, midpoint - offset, y) color = getColor(lpixel) rpixel = getPixel(pic, midpoint + offset, y) setColor(rpixel, color) Note: This is a nested loop, i.e., loop of loop. Why do we need it? 7/10/2012 2012 CS4HS @ UCA 53 To test the function, we • Load a picture object in computer memory >>> mypict = pickAndShow( ) • Apply the function to it >>> mirrorLR(mypict) • Does it work? >>> repaint(mypict) 7/10/2012 2012 CS4HS @ UCA 54 A function named main • We have created functions to perform specific tasks. • These functions can be assembled in solving applications. • By writing a function named main, we can call it without typing in command line • In fact, in C and C++, the main function is required and the only one can be executed directly 7/10/2012 2012 CS4HS @ UCA 55 A sample main function def main(): pict = pickAndShow( ) mirrorLtoR(pict) repaint(pict) Note: Using a simple main function, one may easily test design ideas and subtasks. In computer science, this kind of purpose is also called a driver. 7/10/2012 2012 CS4HS @ UCA 56 Outline of tasks 0. JES Introduction: 1. Load and investigate details of an image 2. Alternate pixel RGB values 3. Solve image puzzles 4. Embed information in a picture 5. Fix the Temple of Hephaestus virtually 6. Land Mark on the moon 7/10/2012 2012 CS4HS @ UCA 57 Landing Dr. Mark Guzdial on the moon From Mark Guzdial’s book: Introduction to computing and programming in Python 7/10/2012 2012 CS4HS @ UCA 58 Application specification • Provided two pictures: background and foreground • Replace the background through background subtraction 7/10/2012 2012 CS4HS @ UCA 59 Applications of chromakey • Weatherman makes forecasts on TV with a green (or blue) background • In TV broadcast, they use background subtraction to combine the map • It is also very popular in making movies. 7/10/2012 2012 CS4HS @ UCA 60 Further specification • Background subtraction is all about replacing some pixels in foreground with those pixels in background (without the person). • In general, it is still hard for a computer to distinguish if a pixel belongs to the foreground or background. • Let us simplify the background with a single color (say green or blue). 7/10/2012 2012 CS4HS @ UCA 61 Where does it belong? • Provide a single colored background • Let a person take a picture with that background • To determine if a pixel belongs to the background or not, we only need to compare color distance. 7/10/2012 2012 CS4HS @ UCA 62 Implementation def chromakey(foreground, background ): for p in getPixels( foreground ): # Assume a pixel blue if the sum of its R + G < B if getRed(p) + getGreen(p) < getBlue(p): bgPixel = getPixel(background, getX(p), getY(p)) newColor = getColor( bgPixel ) setColor( p, newColor ) show( foreground ) Note: We assume that the size of background is no less than that of foreground 7/10/2012 2012 CS4HS @ UCA 63 Land Mark on the moon 7/10/2012 2012 CS4HS @ UCA 64 Land yourself on the moon (or anywhere else you want) virtually? • What do you need (input data)? • Modify the chromakey function • Create a program that can virtually land yourself on the moon (or anywhere else you want to) . 7/10/2012 2012 CS4HS @ UCA 65 7/10/2012 2012 CS4HS @ UCA 66