This program is supposed to take the outline of an image, then split it into different quadrants, then color it, such as the Andy Warhol Marilyn Monroe picture.
Every function up to the "Warholize" function works but it gets stuck on c=getPixel(picEdge,x,y)
under the warholize
function at which I'm not sure what to do. Any help would be greatly appreciated. It is supposed to do "let c be the color of the pixel in picEdge at location x,y "
def main():
pic= makePicture( pickAFile() )
show( pic )
threshold= 10
edgePic= makeOutline( pic, threshold )
warholize(pic)
show(warholize(pic))
def difference( a, b ):
if a > b :
return a - b
else:
return b - a
def intensity( px ) :
r= getRed( px )
g= getBlue( px )
b= getGreen( px )
avg= ( r + g + b ) / 3
return avg
def makeOutline( pic, threshold ):
w= getWidth( pic )
h= getHeight( pic )
edgePic= makeEmptyPicture( w, h )
for x in range(2,w-1) :
for y in range(2,h-1):
px= getPixel( pic, x, y )
pxLeft= getPixel( pic, x-1, y )
pxUp= getPixel( pic, x, y-1 )
leftDiff= difference( intensity(pxLeft), intensity(px) )
upDiff= difference( intensity(pxUp), intensity(px) )
if leftDiff > threshold or upDiff > threshold :
setColor( getPixel(edgePic,x,y), black )
def warholize(pic):
threshold=10
picEdge=makeOutline(pic,threshold)
w= getWidth( pic )
h= getHeight( 开发者_运维问答pic )
picNew= makeEmptyPicture( w, h )
for x in range(0,w,2):
for y in range (0,h,2):
c=getPixel(picEdge,x,y)
px=getPixel(picNew,x/2,y/2)
if c is black:
setColor(px,blue)
else:
setColor(px,yellow)
return picNew
I put the difference and intensity functions into the makeOutline function. I have called the warholize function from the makeOutline function.
Also, you needed to get the colors for the separate quadrants, here, I've just used getRed pixel to see if it is black or white (full color or not).
In this case I have used a threshold of 100 to optimise the effect. I have set the threshold within the makeOutline function, you can play with this, as you wish.
def main():
pic= makePicture( pickAFile() )
show(pic)
newPic= makeOutline(pic )
show(newPic)
def makeOutline(pic ):
picEdge=makeEmptyPicture(getWidth(pic),getHeight(pic))
for x in range (0, getWidth(pic)-1):
for y in range (0, getHeight(pic)-1):
here=getPixel(picEdge,x,y)
down = getPixel(pic,x,y+1)
right = getPixel(pic, x+1,y)
hereL=(getRed(here)+getGreen(here)+getBlue(here))/3
downL=(getRed(down)+getGreen(down)+getBlue(down))/3
rightL=(getRed(right)+getGreen(right)+getBlue(right))/3
if abs (hereL-downL)>100 and abs(hereL-rightL)>100:
setColor(here,black)
if abs (hereL-downL)<=100 or abs(hereL-rightL)<=100:
setColor(here,white)
warholizedPic=warholize(picEdge)
return warholizedPic
def warholize(picEdge):
w= getWidth( picEdge )
h= getHeight( picEdge )
picNew= makeEmptyPicture( w, h )
for x in range(0,w/2):
for y in range (0,h/2):
px=getPixel(picEdge,x,y)
r=getRed(px)
pxNew=getPixel(picNew,x,y)
if r >0:
setColor(pxNew,blue)
else:
setColor(pxNew,yellow)
for x in range (w/2,w):
for y in range (h/2,h):
px=getPixel(picEdge,x,y)
r=getRed(px)
pxNew=getPixel(picNew,x,y)
if r >0:
setColor(pxNew,yellow)
else:
setColor(pxNew,blue)
for x in range(0,w/2):
for y in range (h/2,h):
px=getPixel(picEdge,x,y)
r=getRed(px)
pxNew=getPixel(picNew,x,y)
if r >0:
setColor(pxNew,green)
else:
setColor(pxNew,red)
for x in range (w/2,w):
for y in range (0,h/2):
px=getPixel(picEdge,x,y)
r=getRed(px)
pxNew=getPixel(picNew,x,y)
if r >0:
setColor(pxNew,red)
else:
setColor(pxNew,green)
return picNew
You can adjust which quadrants you want colored as you please.
精彩评论