2013-08-14 5 views
0

의 크기가 조정 된 이미지를 부드럽게하고, 나는 다음과 같은 운동에 붙어 왔 : 당신은 너무 많은 이미지를 조정 한 후내가 <a href="http://interactivepython.org/runestone/static/thinkcspy/toc.html#" rel="nofollow">How to Think Like a Computer Scientist</a>을 통해 내 방식을 일하고 있어요 파이썬

이 고르지 보인다. 이미지의 블럭 니스를 줄이는 한 가지 방법은 각 픽셀을 주변 픽셀의 평균 값으로 대체하는 것입니다. 이것은 색상의 변화를 부드럽게하는 효과가 있습니다. 이미지를 매개 변수로 사용하고 이미지를 부드럽게하는 함수를 작성하십시오. 함수는 이전 이미지와 동일한 새 이미지를 반환해야합니다.

자습서는 잘린 이미지 모듈을 제공하지만 필자는 PIL을 사용하지 않고이 문제를 해결할 수 있어야합니다. 이것은 내가 지금까지 가지고있는 것입니다 :

import image 
#image provided in tutorial 
img = image.Image("luther.jpg") 
win = image.ImageWin() 
factor = 0 

#resize the image 
def resize(img, factor): 
W = img.getWidth() 
H = img.getHeight() 

newW = int(W * factor) 
newH = int(H * factor) 

newImage = image.EmptyImage(newW, newH) 

for col in range(newW): 
    for row in range (newH): 
     p = img.getPixel(col, row) 
     newImage.setPixel(col * factor, row * factor, p) 

newImage.draw(win) 
img = newImage 
return img 
#smooth out the image 
def smooth(img): 
    newImage = image.EmptyImage(img.getWidth(), img.getHeight()) 
    for col in range(img.getWidth()): 
     for row in range(img.getHeight()): 
      p1 = img.getPixel(col, row) 
      p2 = img.getPixel(col+1, row) 
      red1 = p1.getRed() 
      red2 = p2.getRed() 
      green1 = p1.getGreen() 
      green2 = p2.getGreen() 
      blue1 = p1.getBlue() 
      blue2 = p2.getBlue() 
      newRed = (red1 + red2)/2 
      newGreen = (green1 + green2)/2 
      newBlue = (blue1 + blue2)/2 
      newPixel = image.Pixel(newRed, newGreen, newBlue) 
      newImage.setPixel(col, row, newPixel) 
    newImage.draw(win) 

이 함수를 호출하면 "오류 : 할당 전에 참조 된 로컬 변수 red2"가 나타납니다. 나는 인쇄 진술과 함께 줄을 섰다. 이 오류 메시지는 newPixel을 만들려고 할 때까지 반환되지 않습니다. 도움을 주시면 감사하겠습니다.

+0

전체 스택 추적을 게시 할 수 있습니까? 나는이 함수가 그 오류를 어떻게 일으켰는지를 보지 못했다. 아마 그것은 다른 곳에서 오는 것입니다. – user2357112

+0

불행히도, 전체 스택 추적을 게시 할 수 없습니다. 자습서에서 사용되는 activecode 인터프리터가 오류 메시지를 제공하기 때문에 그대로 추적 할 수는 없습니다. (튜토리얼에서 사용 된 이미지 모듈을 설치하는 방법을 알 수 없기 때문에 IDLE에서 스크립트를 실행할 수 없습니다.) – user2684148

답변

0

red2를 인쇄 할 수 있습니까? 그렇다면 출력은 무엇입니까? red2는 None을 얻습니다. 나머지 코드를 게시하여 무언가 이상한 지 알 수 있도록 img

+0

예, red2를 인쇄 할 수 있습니다. 각 픽셀의 빨간색 값을 반환하지만 프로그램이 결국 런타임 제한을 초과하고 중지됩니다. – user2684148

0

코드에 공백과 탭이 섞여 있습니다. 들여 쓰기 수준은 생각하는 것과 같지 않을 수 있으며 프로그램의 블록 구조가 엉망입니다. 편집기에서 8 자리 탭을 사용하여 프로그램을보고 이상적으로 공백 문자를 표시하고 프로그램이 생각했던 것처럼 보이는지 확인하십시오. 또한 공간과 탭을 섞지 마십시오. 당신이 그렇게한다면, 당신을 계속 망칠 것입니다.

+0

공간을 독점적으로 사용하여 들여 쓰기를 다시 인쇄해도 여전히 동일한 오류 메시지가 표시됩니다. – user2684148