python中的图像大小调整算法

python中的图像大小调整算法,python,algorithm,python-3.x,image-resizing,Python,Algorithm,Python 3.x,Image Resizing,因此,我正在学习我自己的python,我坚持练习13,其中说: 编写一个函数来均匀地缩小或放大图像。您的函数应该使用缩放因子拍摄图像。要缩小图像,比例因子应介于0和1之间。要放大图像,比例因子应大于1 这不是关于PIL的问题,而是询问使用哪种算法,以便我自己编写代码 我发现了一些类似的问题,如,但我不知道如何将其转换为python 任何帮助都将不胜感激 我想到这一点: import image win = image.ImageWin() img = image.Image("cy.png")

因此,我正在学习我自己的python,我坚持练习13,其中说:

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

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

我发现了一些类似的问题,如,但我不知道如何将其转换为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()

我应该在函数中这样做,但现在这无关紧要。函数的参数是image,factor。您可以在ActiveCode中的OP教程中尝试它。它会生成一个带有空列的拉伸图像:。

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

Image.resize应该执行您想要的操作

编辑

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

您必须使用以下算法

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

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


如果你想变得有趣,你可以通过与相邻像素平均rgb值来平滑增加或删除的像素

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

Image.resize应该执行您想要的操作

编辑

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

您必须使用以下算法

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

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


如果你想变得有趣,你可以通过与相邻像素平均rgb值来平滑增加或删除的像素

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

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

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

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

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

编辑:由于将浮点坐标发送到getPixel中,所以不限于最近邻,您可以在其中实现任何插值算法。最简单的方法是简单地将坐标截断为int,这将导致在因子大于1时复制像素,或者在因子小于1时跳过像素。

Mark的方法正确。要获得更平滑的结果,请替换:

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处的像素。

Mark的方法正确。要获得更平滑的结果,请替换:

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处的像素。

谢谢你的回答,我知道PIL,但我需要算法,而不是为我做这件事的模块。:在这种情况下,您应该循环图像中的像素,然后每隔一段时间缩小或删除一些像素,或者放大图像中的重复像素。如果你想变得有趣,你可以通过与相邻像素平均rgb值来平滑增加或删除的像素。这些信息够了吗
开始?对不起,不是。我知道这个理论,但我不知道如何实现它。谢谢你的回答,我知道PIL,但我需要的是算法,而不是为我做这件事的模块在这种情况下,您应该循环图像中的像素,然后每隔一段时间缩小或删除一些像素,或者放大图像中的重复像素。如果你想变得有趣,你可以通过与相邻像素平均rgb值来平滑增加或删除的像素。这些信息足够开始吗?对不起,还不够。我知道这个理论,但我不知道如何实施。你能试一下吗?您尝试过任何代码吗?能否显示尝试?您尝试过任何代码吗?这不是只解决缩小操作吗?放大可能仍然需要另一种方法,因为循环超过了输出大小,而不是输入大小,所以它应该适用于任何比例因子。你试过了吗?是的,它是这样工作的:p=img.getPixelintcol/factor,introw/factor。非常感谢:。这不是只针对缩小操作吗?放大可能仍然需要另一种方法,因为循环超过了输出大小,而不是输入大小,所以它应该适用于任何比例因子。你试过了吗?是的,它是这样工作的:p=img.getPixelintcol/factor,introw/factor。非常感谢你:。