我正在How to Think Like a Computer Scientist工作,我一直坚持下面的练习:
在对图像进行过度缩放后,它看起来很块状。减少图像块效应的一种方法是用每个像素周围像素的平均值替换每个像素。这具有平滑颜色变化的效果。编写一个将图像作为参数并平滑图像的功能。您的函数应该返回一个与旧图像相同但又平滑的新图像。
本教程提供了截断的图像模块,但我应该能够在不使用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 :(得分:0)
你可以打印red2,如果那么,输出是什么?对于red2,你可能得到None。请发布您的其余代码,以便我们查看img
是否有问题答案 1 :(得分:0)
您的代码包含混合空格和制表符。缩进级别可能不是您认为的那样,并且程序的块结构搞砸了。在具有8个空格标签的编辑器中查看您的程序,理想情况下可以选择显示空白字符,并查看您的程序是否与您认为的一样。此外,停止混合空格和标签。如果你这样做,它会一次又一次地搞乱你。