2010-02-25 3 views
5

Эта программа должна взять контур изображения, затем разбить его на разные квадранты, а затем покрасить его, например, изображение Энди Уорхола Мэрилин Монро.Обработка изображений на Jython

Каждая функция до функции «Уорхолиза» работает, но она застревает на c=getPixel(picEdge,x,y) под функцией warholize, на которой я не уверен, что делать. Любая помощь будет принята с благодарностью. Он должен делать «пусть с цвет пикселя в picEdge на месте х, у»

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 
+1

Если каждая функция работает с функцией warholize, то как она застревает в функции makeOutline? Вы получаете ошибки? Кто они такие? Кстати, вы вызываете makeOutline в warholize с неопределенным порогом, насколько я могу судить. Кроме того, в makeOutline мне кажется, что ваши диапазоны должны быть в диапазоне (2, w) и диапазоне (2, h). –

+0

Я исправил порог за ваш совет, и он сработал, но теперь он застрял в c = getPixel (picEdge, x, y). Предполагается, что он захватит цвет этого пикселя, но я не уверен, как это сделать. – roger34

+0

Вы действительно хотите дважды вызвать 'warholize()' в 'main()'? – Anthon

ответ

10

Я положил разницу и интенсивности функции в функцию makeOutline. Я вызвал функцию warholize из функции makeOutline.
Кроме того, вам нужно было получить цвета для отдельных квадрантов, здесь я просто использовал пиксель getRed, чтобы увидеть, черный ли он или белый (полный цвет или нет).

В этом случае я использовал порог 100 для оптимизации эффекта. Я установил порог в функции makeOutline, вы можете играть с этим, как хотите.

def main(): 
    pic= makePicture(pickAFile()) 
    show(pic) 
    newPic= makeOutline(pic) 
    show(newPic) 

Pic

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 

Warholized pic

Вы можете настроить которые квадранты вы хотите цветной, как вам угодно.

Смежные вопросы