私はHow to Think Like a Computer Scientistに取り組んでいますが、次の演習で行き詰まってしまいました。
画像を拡大しすぎると、ブロック状に見えます。イメージのブロック化を減らす 1 つの方法は、各ピクセルをその周囲のピクセルの平均値に置き換えることです。これにより、色の変化を滑らかにする効果があります。画像をパラメーターとして取り、画像を平滑化する関数を作成します。関数は、古い画像と同じであるが平滑化された新しい画像を返す必要があります。
チュートリアルでは切り捨てられたイメージ モジュールが提供されていますが、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 が参照されました」というメッセージが表示されます。print ステートメントを 1 行ずつ実行してきました。このエラー メッセージは、newPixel を作成しようとするまで返されません。どんな助けでも大歓迎です。