Images - bowdoin.edumirfan/slides/Prev/2014 Fall/Intro/Images.pdf · Size of images 320 x 240 image...

35
10/15/14 1 CSCI 1101A Images Ch. 2 to 5 [Multimedia—Guzdial] Mohammad T. Irfan 9/30/14 – 10/9/14 Intro to Image & sound Chapter 2 [Guzdial]

Transcript of Images - bowdoin.edumirfan/slides/Prev/2014 Fall/Intro/Images.pdf · Size of images 320 x 240 image...

Page 1: Images - bowdoin.edumirfan/slides/Prev/2014 Fall/Intro/Images.pdf · Size of images 320 x 240 image 640 x 480 image 1024 x 768 monitor 24 bit color (3 bytes) 230,400 bytes 921,600

10/15/14  

1  

CSCI 1101A

Images Ch. 2 to 5

[Multimedia—Guzdial] Mohammad T. Irfan 9/30/14 – 10/9/14

Intro to Image & sound Chapter 2 [Guzdial]

Page 2: Images - bowdoin.edumirfan/slides/Prev/2014 Fall/Intro/Images.pdf · Size of images 320 x 240 image 640 x 480 image 1024 x 768 monitor 24 bit color (3 bytes) 230,400 bytes 921,600

10/15/14  

2  

Jython

u  Jython environment for students (JES)

Use up/down arrows to walk through the command history

Multimedia resource

u  http://www.cc.gatech.edu/~mark.guzdial/mediacomp/mediasources-py2ed.zip

u  This link is also available in the “Resources” section of the class website (http://www.bowdoin.edu/~mirfan/CSCI-1101A.html)

Page 3: Images - bowdoin.edumirfan/slides/Prev/2014 Fall/Intro/Images.pdf · Size of images 320 x 240 image 640 x 480 image 1024 x 768 monitor 24 bit color (3 bytes) 230,400 bytes 921,600

10/15/14  

3  

Using JES command area

>>> print 34 + 56 90 >>> print 34.1/46.5 0.7333333333333334 >>> print 22 * 33 726 >>> print 14 - 15 -1 >>> print “Hello” Hello >>> print “Hello ” + “World!” Hello World!

Adding integers

Dividing floats

Multiplying integers

Subtracting integers

Printing a string

Adding (concatenating) two strings

JES built-in functions

u  A bunch of functions are pre-defined in JES for sound and picture manipulations u  pickAFile()

u  makePicture()

u  makeSound()

u  show()

u  play()

u  Some of these functions accept input parameters

u  Refer to handout

Page 4: Images - bowdoin.edumirfan/slides/Prev/2014 Fall/Intro/Images.pdf · Size of images 320 x 240 image 640 x 480 image 1024 x 768 monitor 24 bit color (3 bytes) 230,400 bytes 921,600

10/15/14  

4  

Warm up: Show a picture

What to do to show a picture

u  1. Get the picture file name (with location in your hard drive)

u  2. Create a picture object

u  3. Show the picture object

Page 5: Images - bowdoin.edumirfan/slides/Prev/2014 Fall/Intro/Images.pdf · Size of images 320 x 240 image 640 x 480 image 1024 x 768 monitor 24 bit color (3 bytes) 230,400 bytes 921,600

10/15/14  

5  

pickAFile() leads to a file chooser! Returns the selected file name with location

Picture Functions

u  makePicture(filename) creates and returns a picture object corresponding to the JPEG filename

u  show(picObj) displays the picture object in a window

u  Weʼ’ll learn functions for manipulating pictures later, like getColor, setColor, and repaint

Page 6: Images - bowdoin.edumirfan/slides/Prev/2014 Fall/Intro/Images.pdf · Size of images 320 x 240 image 640 x 480 image 1024 x 768 monitor 24 bit color (3 bytes) 230,400 bytes 921,600

10/15/14  

6  

Program for showing a picture

#Let the user pick an image file

#Then show the image

#All the print statements are optional

def showPic():

fileName = pickAFile()

print fileName #prints location & name

picObj = makePicture(fileName)

print picObj #prints image info

y = show(picObj)

print y #prints None (nothing returned)

Alternative way

#Let the user pick an image file

#Then show the image

def showPic():

show ( makePicture( pickAFile() ) )

u  Recall: comments u  # single line comment

u ‘‘‘ multiple lines of comment

’’’

Page 7: Images - bowdoin.edumirfan/slides/Prev/2014 Fall/Intro/Images.pdf · Size of images 320 x 240 image 640 x 480 image 1024 x 768 monitor 24 bit color (3 bytes) 230,400 bytes 921,600

10/15/14  

7  

Running your program

u  Remember to load it first! u  Every time you make a change, you will need to

load your program

u  Enter the name of the function and the parameters in parenthesis in the command area u  showPic()

The Most Common JES mistake: Forgetting to Load

Don’t say def showpic(): in command area

Next: Playing sound

Page 8: Images - bowdoin.edumirfan/slides/Prev/2014 Fall/Intro/Images.pdf · Size of images 320 x 240 image 640 x 480 image 1024 x 768 monitor 24 bit color (3 bytes) 230,400 bytes 921,600

10/15/14  

8  

Sound Functions

u  makeSound(filename) creates and returns a sound object u  Allowed file types: wav, aiff, au

u  play(soundObj) makes the sound object play (but doesnʼ’t wait until itʼ’s done)

u  blockingPlay(soundObj) waits for the sound to finish

u  Weʼ’ll learn more later like getSample and setSample

Program

#Play a sound file

def playMusic():

fileName = pickAFile()

soundObj = makeSound(fileName)

play(soundObj)

Page 9: Images - bowdoin.edumirfan/slides/Prev/2014 Fall/Intro/Images.pdf · Size of images 320 x 240 image 640 x 480 image 1024 x 768 monitor 24 bit color (3 bytes) 230,400 bytes 921,600

10/15/14  

9  

A function with parameter

#Play a sound file

def playMusic(fileName):

soundObj = makeSound(fileName)

play(soundObj)

u  To run this program u  Load it first

u  In command area:

u  playMusic(‘c:/backpack.wav’) # For Windows

u  playMusic(‘Users/YourName/Desktop/backpack.wav’) # For Mac

Reading: Introduction to Computing and Programming in Python: A Multimedia Approach [Guzdial] Chapter 3: Modifying Pictures using Loops

Pictures, Pixels, and Colors

Page 10: Images - bowdoin.edumirfan/slides/Prev/2014 Fall/Intro/Images.pdf · Size of images 320 x 240 image 640 x 480 image 1024 x 768 monitor 24 bit color (3 bytes) 230,400 bytes 921,600

10/15/14  

10  

Colors

u  Our perception of color u  spectral vs. mixture

u  Luminance

Pixels

u  We digitize pictures into lots of little dots

u  Enough dots and it looks like a continuous whole to our eye u  Our eye has limited resolution

u  Each picture element is referred to as a pixel

Page 11: Images - bowdoin.edumirfan/slides/Prev/2014 Fall/Intro/Images.pdf · Size of images 320 x 240 image 640 x 480 image 1024 x 768 monitor 24 bit color (3 bytes) 230,400 bytes 921,600

10/15/14  

11  

Pixel objects

u Pixels are picture elements u  Each pixel object

knows its color

u  It also knows where it is in its picture

When we zoom the picture to 500%, we can see individual pixels.

New!!!

A Picture is a matrix of pixels

u  Itʼ’s not a continuous line of elements, that is, a one-dimensional array

u  A picture has two dimensions: Width and Height

u  We need a two-dimensional array: a matrix

Page 12: Images - bowdoin.edumirfan/slides/Prev/2014 Fall/Intro/Images.pdf · Size of images 320 x 240 image 640 x 480 image 1024 x 768 monitor 24 bit color (3 bytes) 230,400 bytes 921,600

10/15/14  

12  

Referencing a matrix

u  We talk about positions in a matrix as (x,y), or (horizontal, vertical)

u  Element (1,0) in the matrix at left is the value 12

u  Element (0,2) is 6

Encoding color

u  Each pixel encodes color at that position in the picture

u  Lots of encodings for color u  Printers use CMYK: Cyan, Magenta, Yellow, and blacK.

u  Others use HSB for Hue, Saturation, and Brightness (also called HSV for Hue, Saturation, and Value)

u  Weʼ’ll use the most common for computers u  RGB: Red, Green, Blue

Page 13: Images - bowdoin.edumirfan/slides/Prev/2014 Fall/Intro/Images.pdf · Size of images 320 x 240 image 640 x 480 image 1024 x 768 monitor 24 bit color (3 bytes) 230,400 bytes 921,600

10/15/14  

13  

Encoding RGB

u  Each component color (red, green, and blue) is encoded as a single byte

u  Colors go from (0,0,0) to (255,255,255) u  If all three components are the

same, the color is in greyscale

u  (200,200,200) at (3,1)

u  (0,0,0) (at position (3,0) in example) is black

u  (255,255,255) is white

How much can we encode in 8 bits?

u  Letʼ’s walk it through. u  If we have one bit, we can represent two patterns:

0 and 1.

u  If we have two bits, we can represent four patterns: 00, 01, 10, and 11.

u  If we have three bits, we can represent eight patterns: 000, 001, 010, 011, 100, 101, 110, 111

u  General rule: In n bits, we can have 2n patterns u  In 8 bits, we can have 28 patterns, or 256

u  If we make one pattern 0, then the highest value we can represent is 28-1, or 255

Page 14: Images - bowdoin.edumirfan/slides/Prev/2014 Fall/Intro/Images.pdf · Size of images 320 x 240 image 640 x 480 image 1024 x 768 monitor 24 bit color (3 bytes) 230,400 bytes 921,600

10/15/14  

14  

Is that enough?

u  Weʼ’re representing color in 24 (3 * 8) bits. u  Thatʼ’s 16,777,216 (224) possible colors

u  Our eye can discern millions of colors, so itʼ’s probably pretty close

u  Some graphics systems support 32 bits per pixel u  May be more pixels for color, or an additional 8

bits to represent 256 levels of transparency

Size of images

320 x 240 image

640 x 480 image

1024 x 768 monitor

24 bit color (3 bytes)

230,400 bytes

921,600 bytes 2,359,296 bytes

32 bit color (4 bytes)

307,200 bytes

1,228,800 bytes

3,145,728 bytes

Page 15: Images - bowdoin.edumirfan/slides/Prev/2014 Fall/Intro/Images.pdf · Size of images 320 x 240 image 640 x 480 image 1024 x 768 monitor 24 bit color (3 bytes) 230,400 bytes 921,600

10/15/14  

15  

Decomposition of a picture

Picture

Pixel

Color

show repaint getPixel getPixels getWidth getHeight

writePictureTo

getRed, getGreen, getBlue setRed, setGreen, setBlue

getColor setColor

getX, getY

makeColor pickAColor

makeDarker, makeLighter

Reminder: Manipulating Pictures

>>> file = pickAFile() >>> print file /Users/yourName/mediasources/barbara.jpg >>> picture = makePicture(file) # picture is a picture object >>> show(picture) >>> print picture Picture, filename /Users/yourName/mediasources/barbara.jpg height 294 width 222

Page 16: Images - bowdoin.edumirfan/slides/Prev/2014 Fall/Intro/Images.pdf · Size of images 320 x 240 image 640 x 480 image 1024 x 768 monitor 24 bit color (3 bytes) 230,400 bytes 921,600

10/15/14  

16  

What is a “picture object?”

u  An “encoding” that represents an image u  Knows its height and width

u  Knows its filename

u  Knows its window if itʼ’s opened (via show and repainted with repaint)

Getting pixels

>>> pixel=getPixel(picture,1,1) >>> print pixel Pixel, color=color r=168 g=131 b=105 >>> pixels=getPixels(picture) >>> print pixels[0] Pixel, color=color r=168 g=131 b=105

getPixel(picture,x,y) gets a single pixel

getPixels(picture) gets all of them in a list

(In the following code, picture is a picture object – previously defined.)

Page 17: Images - bowdoin.edumirfan/slides/Prev/2014 Fall/Intro/Images.pdf · Size of images 320 x 240 image 640 x 480 image 1024 x 768 monitor 24 bit color (3 bytes) 230,400 bytes 921,600

10/15/14  

17  

What can we do with a pixel?

•  getRed, getGreen, and getBlue are functions that take a pixel as input and return a value between 0 and 255

•  setRed, setGreen, and setBlue are functions that take a pixel as input and a value between 0 and 255

We can also get, set, and make Colors u  getColor takes a pixel as input and returns a

Color object with the color at that pixel u  setColor takes a pixel as input and a Color,

then sets the pixel to that color u  makeColor takes red, green, and blue values

(in that order) between 0 and 255, and returns a Color object

u  pickAColor lets you use a color chooser and returns the chosen color

u  We also have functions that can makeLighter and makeDarker an input color

Page 18: Images - bowdoin.edumirfan/slides/Prev/2014 Fall/Intro/Images.pdf · Size of images 320 x 240 image 640 x 480 image 1024 x 768 monitor 24 bit color (3 bytes) 230,400 bytes 921,600

10/15/14  

18  

Demo: pixels and colors (continued from previous slides)

>>> print getRed(pixel) 168 >>> setRed(pixel,255) >>> print getRed(pixel) 255 >>> color=getColor(pixel) >>> print color color r=255 g=131 b=105 >>> newColor=makeColor(0,100,0) >>> print newColor color r=0 g=100 b=0 >>> setColor(pixel,newColor) >>> print getColor(pixel) color r=0 g=100 b=0

Demo >>>color = makeColor(81,63,51) >>>newcolor = makeColor(255,51,51) >>> print color color r=81 g=63 b=51 >>> print newcolor color r=255 g=51 b=51 >>> print distance(color,newcolor) 174.41330224498358 >>> print color color r=168 g=131 b=105 >>> print makeDarker(color) color r=117 g=91 b=73 >>> print color color r=117 g=91 b=73 >>> newcolor=pickAColor() >>> print newcolor color r=255 g=51 b=51

Another example (not continued from the previous slide).

Page 19: Images - bowdoin.edumirfan/slides/Prev/2014 Fall/Intro/Images.pdf · Size of images 320 x 240 image 640 x 480 image 1024 x 768 monitor 24 bit color (3 bytes) 230,400 bytes 921,600

10/15/14  

19  

Distance between colors u  How close are two colors? u  Distance

u  Pretend itʼ’s cartesian coordinate system u  Distance between two points:

u  Distance between two colors: u  distance(color1, color2) function returns the following

We can change pixels directly…

>>> file="/Users/yourName/mediasources/barbara.jpg" >>> pict=makePicture(file) >>> show(pict) >>> setColor(getPixel(pict,10,100),yellow) >>> setColor(getPixel(pict,11,100),yellow) >>> setColor(getPixel(pict,12,100),yellow) >>> setColor(getPixel(pict,13,100),yellow) >>> repaint(pict)

But that’s really dull and boring to ���change each pixel at a time…���Isn’t there a better way?

Page 20: Images - bowdoin.edumirfan/slides/Prev/2014 Fall/Intro/Images.pdf · Size of images 320 x 240 image 640 x 480 image 1024 x 768 monitor 24 bit color (3 bytes) 230,400 bytes 921,600

10/15/14  

20  

Use a loop!

#Take a picture object as parameter���#Make every pixel 50% less red def decreaseRed(picture): for p in getPixels(picture): originalRed = getRed(p) setRed(p, originalRed*0.5)

In command area: >>> file="/Users/yourName/mediasources/barbara.jpg" >>> picture=makePicture(file) >>> show(picture) >>> decreaseRed(picture) >>> repaint(picture)

You can also write a function pixelDemo() with these lines

there New!

Converting to grayscale u  We know that if red=green=blue, we get gray

u  But what value do we set all three to?

u  What we need is a value representing the darkness of the color, the luminance

u  There are lots of ways of getting it, but one way that works reasonably well is dirt simple—simply take the average:

Page 21: Images - bowdoin.edumirfan/slides/Prev/2014 Fall/Intro/Images.pdf · Size of images 320 x 240 image 640 x 480 image 1024 x 768 monitor 24 bit color (3 bytes) 230,400 bytes 921,600

10/15/14  

21  

Converting to grayscale

def grayScale(picture): for p in getPixels(picture): intensity = (getRed(p)+getGreen(p)+getBlue(p))/3 setColor(p, makeColor(intensity,intensity,intensity))

Alternatives?

Weighted grayscale

u  newRed = originalRed * 0.299

u  newGreen = originalGreen * 0.589

u  newBlue = originalBlue * 0.114

u  intensity = newRed + newGreen + newBlue

def weightedGrayScale(picture):     for p in getPixels(picture):         intensity = getRed(p)* 0.299 + getGreen(p)* 0.589 + getBlue(p)* 0.114         setRed(p, intensity)         setGreen(p, intensity)         setBlue(p, intensity)     repaint(picture)

Page 22: Images - bowdoin.edumirfan/slides/Prev/2014 Fall/Intro/Images.pdf · Size of images 320 x 240 image 640 x 480 image 1024 x 768 monitor 24 bit color (3 bytes) 230,400 bytes 921,600

10/15/14  

22  

Can we reverse grayscale and get back the original colors? No.

u  Weʼ’ve lost information u  We no longer know what the ratios are between

the reds, the greens, and the blues

u  We no longer know any particular value.

Creating a negative Original negative negative-negative

Page 23: Images - bowdoin.edumirfan/slides/Prev/2014 Fall/Intro/Images.pdf · Size of images 320 x 240 image 640 x 480 image 1024 x 768 monitor 24 bit color (3 bytes) 230,400 bytes 921,600

10/15/14  

23  

Creating a negative

u  Inverse the colors u  newRed = 255 – originalRed

u  Similar for green and blue

def negative(picture): for px in getPixels(picture): r = getRed(px) g = getGreen(px) b = getBlue(px) negativeColor = makeColor(255-r, 255-g, 255-b) setColor(px, negativeColor)

Alternatives?

Class Participation Homework 2 (1 point) u  Practice the codes from sections 3.4

(creating a sunset) and 3.5 (lightening and darkening)

u  Submit the printouts this Thursday

Page 24: Images - bowdoin.edumirfan/slides/Prev/2014 Fall/Intro/Images.pdf · Size of images 320 x 240 image 640 x 480 image 1024 x 768 monitor 24 bit color (3 bytes) 230,400 bytes 921,600

10/15/14  

24  

Advanced Image Manipulation Techniques

Ch. 4 [Guzdial]

Problem: convert a rectangular part of a picture to grayscale u  Not all pixels will be converted to grayscale

u  How can we select pixels from a rectangular area of the picture? u  Top-left corner: (startX, startY)

u  Width of the rectangle

u  Height of the rectangle

Page 25: Images - bowdoin.edumirfan/slides/Prev/2014 Fall/Intro/Images.pdf · Size of images 320 x 240 image 640 x 480 image 1024 x 768 monitor 24 bit color (3 bytes) 230,400 bytes 921,600

10/15/14  

25  

Solution

Problem: Mirror a picture vertically

Issues: 1.  How to mirror a pixel? 2.  Select pixels to be mirrored

•  What would be the range of x values? •  What would be the range of y values?

Page 26: Images - bowdoin.edumirfan/slides/Prev/2014 Fall/Intro/Images.pdf · Size of images 320 x 240 image 640 x 480 image 1024 x 768 monitor 24 bit color (3 bytes) 230,400 bytes 921,600

10/15/14  

26  

Solution

Alternative way of creating picture objects u  setMediaPath()

u  select a “source” folder for pictures

u  fileName = getMediaPath(“jungle2.jpg”)

u  picObject = makePicture(fileName)

Page 27: Images - bowdoin.edumirfan/slides/Prev/2014 Fall/Intro/Images.pdf · Size of images 320 x 240 image 640 x 480 image 1024 x 768 monitor 24 bit color (3 bytes) 230,400 bytes 921,600

10/15/14  

27  

Problem: Crop part of an image into a newly created blank canvas

Solution

u  Note: following solution is a simpler version of textbook programs 27 and 28

Which folder? The folder selected

for setMediaPath()

Page 28: Images - bowdoin.edumirfan/slides/Prev/2014 Fall/Intro/Images.pdf · Size of images 320 x 240 image 640 x 480 image 1024 x 768 monitor 24 bit color (3 bytes) 230,400 bytes 921,600

10/15/14  

28  

Problem: Rotate a picture CCW and save it in a new canvas

Solution

u  Simpler (and different) version of textbook’s programs 32 and 33

Page 29: Images - bowdoin.edumirfan/slides/Prev/2014 Fall/Intro/Images.pdf · Size of images 320 x 240 image 640 x 480 image 1024 x 768 monitor 24 bit color (3 bytes) 230,400 bytes 921,600

10/15/14  

29  

Class participation HW 3

u  Class participation HW 3 (practice problems) u  Mirroring the temple and making collage (from Ch.

4).

u  Submit the printouts by Tuesday, Oct 21. Try to solve these in a different way.

Advanced Image Manipulation Techniques

Ch. 5 [Guzdial] 10/16

Page 30: Images - bowdoin.edumirfan/slides/Prev/2014 Fall/Intro/Images.pdf · Size of images 320 x 240 image 640 x 480 image 1024 x 768 monitor 24 bit color (3 bytes) 230,400 bytes 921,600

10/15/14  

30  

Announcements u  Class participation HW 3 (practice problems)

u  Mirroring the temple and making collage (from Ch. 4).

u  Chromakey (Ch. 5)

u  Submit the printouts by Tuesday, Oct 21. Try to solve these (especially, Ch 4) in a different way.

u  Lab Assignment 5 is due on Monday, Oct 20 (11:59pm) u  Note: The two versions of flipping will produce two

different flipped images. That is fine, but you still need to do both versions.

u  Lab Assignment 6 is due on Friday, Oct 24 (11:59pm)

u  Agenda for tomorrow’s lab u  Work on lab assignments 5 and 6

Problem: red-eye reduction

u  Write a function for red-eye reduction u  Parameters: picture object, coordinates for the

box, replacement color

u  Show the modified picture object

Page 31: Images - bowdoin.edumirfan/slides/Prev/2014 Fall/Intro/Images.pdf · Size of images 320 x 240 image 640 x 480 image 1024 x 768 monitor 24 bit color (3 bytes) 230,400 bytes 921,600

10/15/14  

31  

Algorithm

for every x coordinate within the box

for every y coordinate within the box

px = pixel at (x, y)

if distance(red, px’s color) < 165

change px’s color

show the modified picture

return the modified picture

Complexity?

Code

Page 32: Images - bowdoin.edumirfan/slides/Prev/2014 Fall/Intro/Images.pdf · Size of images 320 x 240 image 640 x 480 image 1024 x 768 monitor 24 bit color (3 bytes) 230,400 bytes 921,600

10/15/14  

32  

Problem: Blur a picture

u  How to blur?

u  Algorithm

for all reasonable x coordinates for all reasonable y coordinates Make pixel (x, y)’s r, g, b components the average of surrounding pixels’ r, g, b, resp.

Code

Page 33: Images - bowdoin.edumirfan/slides/Prev/2014 Fall/Intro/Images.pdf · Size of images 320 x 240 image 640 x 480 image 1024 x 768 monitor 24 bit color (3 bytes) 230,400 bytes 921,600

10/15/14  

33  

Problem: edge detection

Tracking moving objects

Page 34: Images - bowdoin.edumirfan/slides/Prev/2014 Fall/Intro/Images.pdf · Size of images 320 x 240 image 640 x 480 image 1024 x 768 monitor 24 bit color (3 bytes) 230,400 bytes 921,600

10/15/14  

34  

How to detect edges?

u  What is an edge?

u  There is an abrupt change of color

u  Algorithm

for each x coordinate

for each y coordinate

if the luminance of (x, y) pixel is very different from that of its neighboring pixels, (x, y) is part of an edge

u  In addition to above, we want to create and return a new picture that shows the edges

Code

Page 35: Images - bowdoin.edumirfan/slides/Prev/2014 Fall/Intro/Images.pdf · Size of images 320 x 240 image 640 x 480 image 1024 x 768 monitor 24 bit color (3 bytes) 230,400 bytes 921,600

10/15/14  

35  

Class participation HW3 u  Mirroring temple and collage (Ch. 4) u  Chromakey (Program 47)

u  Here, the source and bg parameters are picture objects. File names as arguments will not work. You will need to create the picture objects from the command area first. You can then supply those picture objects to the chromakey function. Here’s one way of creating these picture objects (type the following in command area):

u  setMediaPath()

u  file = getMediaPath(“blue-mark.jpg”)

u  source = makePicture(file)

u  file = getMediaPath(“moon-surface.jpg”)

u  bg = makePicture(file)

u  chromakey(source, bg) #call the chromakey function #with proper arguments