在 Python 中按 K 因子缩放图像的最简单算法

Posted

技术标签:

【中文标题】在 Python 中按 K 因子缩放图像的最简单算法【英文标题】:Simplest algorithm for zooming an image in Python by K factor 【发布时间】:2021-06-24 23:11:24 【问题描述】:

我是 Python 的新手。

我可以将图像放大 3 倍的最简单算法是什么? 我不想使用已经提供的缩放功能。

【问题讨论】:

您是否尝试过实现该算法?这是基本的数据操作,使用数组 不,我没有。该算法是我正在寻找的。如果我得到一个 K 因子缩放算法,我可以稍微调整一下,但我不能自己写一个。 你附上的链接(tutorialspoint.com/dip/zooming_methods.htm)已经提到了这些步骤。那有什么问题呢? 问题是我对如何将这些步骤转换为代码行感到困惑。如果您可以为其编写代码行,请这样做,我将不胜感激。 【参考方案1】:

这个任务比较繁琐,所以我展示了一种实现行缩放的简单方法。您也可以类似地修改索引以实现new_image 的列索引。

# loading the image
from PIL import Image
import numpy as np
image = np.asarray( Image.open("img.jpg") )
import matplotlib.pyplot as plt

# create new image of correct size
m = len(image[0])
n = len(image)
factor = 3
new_image = np.zeros((factor*(n-1) + 1,factor*(m-1) + 1,3), dtype=int)

# implement row zooming
for i in range(n):
    row = image[i]
    for k in range(len(row)-1):
        new_image[i][k*factor], new_image[i][(k+1)*factor] = row[k], row[k+1]
        for mode in range(3):
            # need mode as three colour channels in RGB

            lo = int(min(row[k][mode], row[k+1][mode]))
            hi = int(max(row[k][mode], row[k+1][mode]))
            diff = int((hi-lo)//factor)
            for x in range(factor-1):
                new_image[i][k*factor+1+x][mode] = lo + (x*diff)

【讨论】:

【参考方案2】:

假设您的文件系统上有一个名为 lenna.png 的 .png 图像。您可以加载它并将其转换为像这样的 numpy 数组

from PIL import Image
import numpy as np
image = np.asarray( Image.open("lenna.png") )
import matplotlib.pyplot as plt
plt.imshow(image)
plt.show()

Numpy 提供了一种简单的方法来增加像素分辨率,如下所示:

# Simply increase the resolution of the image by repeating the pixels
zoom_factor = 3
for i in range(2):
    image = np.repeat(image, zoom_factor, axis=i)

如果我们绘制图像,它现在只是在每个维度上都有更多像素:

然后您可以通过像这样裁剪新的高分辨率图像来仅显示图像的一部分

# Focus on any paricular region by croping it out
image = image[700:1000, 700:1000]
plt.imshow(image)
plt.show()

结果如下所示

干杯!

【讨论】:

好的,这个我明白了,但是这是像素复制的方法。不是有K倍缩放的算法吗?其中两个像素值相减,然后除以因子 K,然后将结果与较小的像素值相加。我想放大 3 倍。 你是什么意思?您想扭曲图像,使像素不再具有与原始图像完全相同的值吗?那么我猜你实际上并没有缩放。我猜你是想说你想运行一个大小为 3x3 的均值滤波器?也就是说,您要对图像进行下采样吗? 不,结果值是在两个原始像素之间相加的。我正在尝试遵循本教程中的 K 倍缩放方法:tutorialspoint.com/dip/zooming_methods.htm

以上是关于在 Python 中按 K 因子缩放图像的最简单算法的主要内容,如果未能解决你的问题,请参考以下文章

如何在 UIScrollView 中找到 UIImageView 的缩放因子

在放大的图像上查找缩放中心坐标

为啥在图像分类的预处理步骤中按样本在 -1 和 1 之间缩放像素

如何检索 WinForms PictureBox 的缩放因子?

使用 OpenCL 内核的最近邻插值代码

在 JScrollPane 中按比例绘制图像