在python中调整图像算法的大小

时间:2012-09-16 14:09:42

标签: python algorithm python-3.x image-resizing

所以,我正在通过this tutorial学习我的自我python而且我坚持使用练习号13,其中说:

编写一个函数来均匀缩小或放大图像。您的功能应该拍摄图像以及缩放系数。要缩小图像,比例因子应介于0和1之间,以放大图像,缩放系数应大于1.

这不是关于PIL的问题,而是询问使用哪种算法,以便我自己编写代码。

我发现了一些像this这样的类似问题,但我不知道怎么把它翻译成python。

任何帮助都将不胜感激。

我来到这里:

import image

win = image.ImageWin()
img = image.Image("cy.png")

factor = 2

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)

win.exitonclick()

我应该在一个函数中执行此操作,但这现在无关紧要。函数的参数是(图像,因子)。您可以在ActiveCode的OP教程中试用它。它使用空列生成拉伸图像:。

3 个答案:

答案 0 :(得分:2)

显示的代码对于所谓的最近邻调整大小简单有效,除了一个小错误:

    p = img.getPixel(col/factor,row/factor)
    newImage.setPixel(col,row,p)

编辑:因为您将浮点坐标发送到getPixel,所以您不仅限于最近邻 - 您可以实现内部所需的任何插值算法。最简单的做法是将坐标截断为int,这会导致在factor大于1时复制像素,或在factor小于1时跳过。

答案 1 :(得分:1)

您可以使用Python Imaging Library执行此操作。

Image.resize()应该做你想做的事。

请参阅http://effbot.org/imagingbook/image.htm

修改

由于您想在不使用模块的情况下自行编程,因此我添加了一个额外的解决方案。

您必须使用以下算法。

加载您的图片 提取它的大小 计算所需的大小(高度*系数,宽度*系数) 创建一个具有所需大小的新EmptyImage

在图像中使用嵌套循环像素(逐行)。 然后(缩小)你每隔一段时间删除一些像素,或者(放大)你复制图像中的一些像素。

如果您希望获得幻想,可以通过将rgb值与其邻居平均来平滑添加或删除的像素。

答案 2 :(得分:1)

马克有正确的方法。为了获得更平滑的结果,请替换:

p = img.getPixel(col/factor,row/factor)

具有一个函数,该函数采用浮点坐标并返回从源图像中的几个相邻点插值的像素。对于线性插值,它需要四个最近的内部;对于高阶插值,需要更多的周围像素。

例如,如果col / factor = 3.75且row / factor = 1.9,则线性插值将采用(3,1),(3,2),(4,1)和(4, 2)并在这4个rgb值之间给出一个结果,最重要地加权到(4,2)处的像素。