【问题标题】:Resizing image algorithm in python在python中调整图像大小算法
【发布时间】:2013-08-12 00:02:20
【问题描述】:

所以,我正在通过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 教程中尝试它。它制作了一个带有空列的拉伸图像:.

【问题讨论】:

  • 你能展示一个尝试吗?您尝试过任何代码吗?

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


【解决方案1】:

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

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

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

【讨论】:

  • 这不是只解决收缩操作吗?升级可能仍需要另一种方法。
  • @hippocampus 它应该适用于任何比例因子,因为您的循环超过了输出大小而不是输入大小。你试过了吗?
  • 是的,它可以工作,就像这样:p = img.getPixel(int(col/factor),int(row/factor))。非常感谢:)。
【解决方案2】:

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

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) 处的像素权重最大。

【讨论】:

    【解决方案3】:

    您可以使用 Python Imaging Library 做到这一点。

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

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

    编辑

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

    您必须使用以下算法。

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

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

    如果您想变得花哨,可以通过将 rgb 值与相邻像素进行平均来平滑添加或删除的像素。

    【讨论】:

    • 感谢您的回答,我知道 PIL,但我需要算法,而不是某个为我做的模块。 :)
    • 在这种情况下,您应该遍历图像中的像素,然后(用于缩小)每隔一段时间删除一些像素,或者用于(放大)复制图像中的一些像素。如果您想变得花哨,可以通过将 rgb 值与相邻像素进行平均来平滑添加或删除的像素。这些信息足够开始了吗?
    • 对不起,不是。我知道这个理论,但我不知道如何实现它。
    猜你喜欢
    • 2011-03-20
    • 1970-01-01
    • 2016-08-25
    • 1970-01-01
    • 2018-11-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多