python中的图像缩放算法

2024-05-19 16:09:50 发布

您现在位置:Python中文网/ 问答频道 /正文

所以,我正在通过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教程中试试。它生成一个具有空列的拉伸图像:。


Tags: 函数图像imageimgforcolthiswin
3条回答

您可以使用Python映像库来实现这一点。

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

http://effbot.org/imagingbook/image.htm

编辑

由于您想自己编程而不使用模块,我添加了一个额外的解决方案。

您必须使用以下算法。

加载图像 提取它的大小 计算所需尺寸(高度*系数、宽度*系数) 创建具有所需大小的新空图像

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

如果你想得到花哨的效果,你可以平滑添加或删除的像素,方法是用它们的邻域平均rgb值。

如图所示的代码对于最近邻居的大小调整非常简单有效,除了一个小错误:

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

编辑:由于您要将浮点坐标发送到getPixel中,因此您不限于最近的邻居-您可以在其中实现所需的任何插值算法。最简单的方法是将坐标截断为int,这将导致当factor大于1时复制像素,或当factor小于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)处的像素权重最大。

相关问题 更多 >