-
For this section we're going to take the
techniques we've built up so far, with the
-
for-loop and the if-statement and the
average technique to detect color areas,
-
and put them together to do a real movie
special effect. So this special effect is
-
called blue screening. And I should point
out that what you think of as video data
-
is really just made of a series of regular
still images, just showed something like
-
twenty to 60 times per second. So for our
purposes we'll just do the special effect
-
on still images, and you can see how it'll
generalize to movies. So the idea is it'll
-
be a very simple model. Imagine I have the
stop sign image. So we've, we've talked
-
about the code to detect the red area
inside of here. So for the blue screen
-
effect, we're gonna have a second image
which I'll call the, the background image.
-
And the idea is, we'll detect the red
areas, as we've done before. But whenever
-
I get a pixel over here on the red area, I
wanna think about the sort of
-
corresponding pixel over from this other
image. And I'm gonna copy that pixel over
-
to sorta fill in all the red area over
here with pixels over here from the other
-
image. Sorry, it's a slightly more
detailed diagram of it. So, I'll do
-
examples in a little bit. But we're going
to have a for-loop where we're kind of
-
looping through this image. And we'll have
an if-statement which is going to identify
-
some of the pixels up here. So let's say
we've identified this pixel in the left
-
image. So that pixel has some x-y-coordinate and we haven't messed with the
-
x-y very much up to now but it, you know,
maybe x is 200 and y is 100 or whatever.
-
So what we want to do is get those two
numbers. And then find the corresponding
-
pixel over here from the other image. So,
maybe a (200,100), or whatever it is.
-
There's some pixel that matches up. So
once we've got that corresponding image, a
-
corresponding pixel from the other image.
Then we wanna copy it over, to set the
-
pixel over here. And you know, how's that
going to work, how do you copy a pixel
-
over? You have to think about, 'Well, what
defines a pixel? What makes a pixel look
-
the way it looks?' And the answer is it's
just the three numbers. It's just red,
-
green and blue. So we're going to write
code to sort of get the red value from
-
this pixel over here and then set that as
the red value over here. Likewise for
-
green and blue. And by setting all those
three numbers over we're going to make the
-
pixel over on this image just look exactly
the same as the pixel over here on this
-
side. So, here's some code, here's our
first code example to do this. And rather
-
than sorta describe the effect, I think in
this case I'll just run it so we can see
-
it, and then I'll talk about what the
lines do. So, here we see the sorta as
-
outlined before, the stop sign with all
its all the red areas of the stop sign.
-
We've substituted in pixels from the leaves
image instead. So let me point out the,
-
the, how the parts of this work. So first
off In all of examples up to now, I think
-
we've just opened one image, but it turns
out you can have multiple images. So here
-
I open a second image, for the leaves.jpeg, and I store that in a variable
-
called back. So then all this code we've
seen before. I'm just looping over the
-
stop sign and detecting the red pixels. So
the interesting action is here inside of
-
the if-statement. What do we do when we
have a red pixel. And it sorta breaks down
-
to three parts. So these first two lines
just call pixel.getX() and pixel.getY(), and
-
store the resulting values in variables x
and y. Now I don't think I've used getX()
-
and getY() up to now, but what tho-, what
those do is just go to a pixel and
-
retrieve whatever its x, y is out of it,
so very analogous to getRed() and getBlue().
-
So I'm just gonna store those in these
variables x y. And then on this line. I
-
take those two numbers, x and y. Actually
I'll sorta read it left to right here. So
-
I go to the back image, so that's the, the
leaves image. And I call getPixel, so I
-
wanna retrieve a pixel out of it. And then
I have to give it some x, y, and in this
-
case the x and y I wanna use is the x, y
that was set right here. So essentially,
-
it's the x, y of the pixel from the stop
sign image, saying, whatever that x, y is,
-
go get that s, the pixel at the same x, y
from the leaves image. So. Once we've got
-
that pixel, then I'm just going to start
another variable called pixel2. So
-
a natural question would be like, oh well
couldn't we just call that pixel? Well we
-
can't call it pixel, because we're already
using pixel to refer to the pixels from
-
the stop sign image. So, pixel2 just
seemed like sorta the most obvious other
-
name to use. All right, so at this point,
I've got pixel2 and pixel2 refers to
-
the pixel from the background image, from
the other image. And now, these three
-
lines do what I was describing before as a
copy. So let's just look at the first one.
-
So it says pixel.setRed. So we've
seen that, like, a 100 times. I'm gonna set
-
the red value of the pixel from the stop
sign image. And what, what am I gonna set
-
that red value to be? And what I'm gonna
set it to be, is, pixel2.getRed().
-
So I'm getting the pixel from the other
image, getting it's red value. So, 160, or
-
whatever it is. And I'm just gonna set
that into the stop sign image. So
-
repeating that for green and blue, we're
just, essentially just, we're copying the
-
three numbers over. So, in effect, this
copies the pixel. So, this is fairly
-
complicated. I want to do a few examples
of this. So let me do a second example.
-
This is a picture of baby Abby, when she's
like six months old. Happy little baby on
-
her bouncy chair. And later when she's a
teenager she can be mad at me for using
-
this example. So what I'm going to do is,
or, what I want to do in this case is,
-
notice the green areas of the bouncy
chair. I want to kind of copy over the
-
leaves so we get this kind of nature baby
leafy effect. And, as, as I recall, there
-
were basically two things that I needed to
do in the loop here. Well first I should
-
point out, so I'm, I'm going to call pixel.getGreen(), for the, the if-test. So
-
the first problem was this. Get the, get
pixel2. Get the corresponding pixel.
-
And here I'm going to write it just as one
line. So I say, back - so I go to the other
-
image - back.getPixel. And I'll sort
of space it out here. I want to get the
-
pixel from the other image, and then I
have to specify the x, y. And here what I
-
want to do is, well, I wanna specify the
x, y, of the pixel from the stop sign
-
image. And previously I did that by having
x, y variables, and well, that's fine. But
-
I'm, in this case I'm gonna compact it
down to just do it in one line. So really
-
I can just say, pixel.getX(). So pixel is
the pixel from the stop sign image. And
-
I'll just call getX() and that gets the
x-value and then I'll just, I'll put that
-
directly here inside of. The back.getPixel
call. So this it's the same idea as before
-
but I've just compacted it down to one
line. All right, so that one line sets
-
pixel2 to be the corresponding pixel.
And then the second thing we need to do in
-
the loop is this copy over operation, and
that is just literally the same so I'll
-
just, I'll copy that from up here.
Alright. So now get rid of the blank.
-
These blank lines are harmless. Alright,
so let's try, let's try that. Alright. So
-
you can see we have, we're getting a
little bit of the leaf data in here but
-
it's not it's a little thin. So we need to
make this a little smaller. .4 it's a
-
little bit more, I want more. .2. Just a little bit more and.
-
Too much. [laugh] All right. So let's try
1.05. Too much for me. Okay, I think
-
that's pretty good. So you could see, it's
sort of, you know, there was green arrows
-
over here. There's sort of the shadow area
that's, I mean, maybe just barely
-
greenish. And then there was some green
blankets over here that we sort of
-
sprinkled these leaves in. So it's, it's a
nice effect. Or, it's sort of eerie,
-
right, that we've gotten these pixels from
the leaf image, and sort of put them into
-
this other image, and it looks, well, not
totally realistic. But you could see
-
where, with tuning, you could get this
real effect. Alright, so let's try one
-
like the movies. So here is our movie star,
monkey. And I've taken a picture of monkey
-
in front of a blue background. It's just a
blue towel. You'll see that monkey is
-
brown and has kind of a light tummy here
and here, this banana is sort of a light
-
yellow. So if you think of brown and tan
and yellow, those are all kind of. On near
-
yellow, right? So there's a lot of
red/green used to make this up. Not a lot
-
of blue. So separating the monkey from the
blue background, in terms of, thinking of
-
it in terms of RGB, is gonna work pretty
well. So here's what I wanna use as the
-
background. This is a candidate for one of
the most famous pictures ever taken. This
-
is a picture taken by the Apollo 8
astronauts as they were, they were in
-
orbit. They were flying around the moon,
and as they came around here's, the Earth
-
loomed. Sort of showing the Earth just
over the horizon of the moon. Emphasizing it's
-
just a little lifeboat we're all on. So
what I want to do is start with the monkey
-
image, and for all these blue pixels, I
want to pull in, pixels from the moon
-
image. And so it'd look like the monkey is
like, on vacation on the moon. And so I'll
-
just grab. This code to get started. Let's
see. Okay, so what I wanna do is, for the
-
if, I wanna say if getBlue(). So I wanna
detect the blue background right? And if
-
it's the blue background, then I wanna
pull it over pixels from the, the moon. So
-
here our image is monkey back is moon.jpg I've got my if- statement. And
-
then, this code is unchanged,
right? It's just, get the corresponding
-
from, it's unchanged from the earlier
example. So just get the corresponding
-
pixel, copy over red, green, blue. So
that, that requires no change at all.
-
Alright, so let's try it. Alright, so it,
at 1.5 what's happening here is the if
-
statement is never firing. I've specified,
I've made the hurdle too high. Okay so
-
let's try 1.3. Oh, just a little teeny
hunt. So I'm too high. Let's try 1.1. Huh,
-
okay. So now you can see, you know, for s,
the bluishness of this part of the blue
-
background was maybe just a little bit
more, so we're getting that, but not down
-
here. So I need to try 1.0. Now it's
getting there. We have a little bit less,
-
so actually we can go under we can go
under 1 here so I'll try 0.9 as the
-
hurdle where I'm just lowering the hurdle.
Ooh, that's pretty good. See, there's a
-
little teeny bit of moon on his chin
there. 0.95. There we go, that's pretty
-
good. We could, we could tweak this
[inaudible], I think, three, there's a
-
little bit of, there we go. I think that's
perfect. So, you can see that's, you know,
-
movie star in laser battles, spaceship,
whatever, like. All right. So just to
-
kinda summarize. In the code you're gonna
have two images instead of one and then
-
you loop through the main image and just
kinda the way we've done before,
-
identifying areas of some color. And then,
once you've identified an area that's in
-
the color you care about, then there's
this operation to locate the corresponding
-
pixel from the other image, and then copy
over its red, green, blue values to, to
-
get the effect done. And as you can
imagine. You know, it's pretty easy to
-
make up exercises that work on this
technique.