有人能否逐行解释一下这段Python代码的工作原理?

4

我现在正在使用numpy和scipy进行图像处理。我有一段代码可以放大图像,但不确定它是如何工作的。

因此,希望一些精通python中scipy/numpy的专家能够逐行解释给我听。我非常渴望学习。

import numpy as N
import os.path
import scipy.signal
import scipy.interpolate
import matplotlib.pyplot as plt
import matplotlib.cm as cm


def enlarge(img, rowscale, colscale, method='linear'):
    x, y = N.meshgrid(N.arange(img.shape[1]), N.arange(img.shape[0]))
    pts = N.column_stack((x.ravel(), y.ravel()))
    xx, yy = N.mgrid[0.:float(img.shape[1]):1/float(colscale),
            0.:float(img.shape[0]):1/float(rowscale)]
    large = scipy.interpolate.griddata(pts, img.flatten(), (xx, yy), method).T
    large[-1,:] = large[-2,:]
    large[:,-1] = large[:,-2]
    return large

非常感谢。

2
Python中每个语句的缩进都很重要。请修复您代码片段的格式。 - johnsyweb
谢谢,对此我感到抱歉。我添加了这些导入语句以使其更清晰明了。 - Hold_My_Anger
请注意,在此处使用griddata不是最有效的选项,因为网格始终是矩形的。更有效的选项是:scipy.interpolate.RectBivariateSplinescipy.ndimage.zoom - pv.
1个回答

5
首先,创建一个空点的网格,每个像素一个点。
x, y = N.meshgrid(N.arange(img.shape[1]), N.arange(img.shape[0]))

实际的图像像素被放置在变量 pts 中,这将在后面需要使用。
pts = N.column_stack((x.ravel(), y.ravel()))

接着,它会为放大后的图片创建一个每个像素点一个的网格;如果原始图片是200x400,colscale设置为4,rowscale设置为2,则网格将有(200*4)x(400*2)或800x800个点。

xx, yy = N.mgrid[0.:float(img.shape[1]):1/float(colscale),
        0.:float(img.shape[0]):1/float(rowscale)]

使用scipy,将pts变量中的点插值到更大的网格中。插值是在从较小的点集转换为较大的点集时通常用于填充或估计缺失点的方式。
large = scipy.interpolate.griddata(pts, img.flatten(), (xx, yy), method).T

我不确定最后两行代码的作用,需要回去查看griddata方法的返回值。看起来它似乎会丢弃一些不必要的数据,或者进行一些转换。

large[-1,:] = large[-2,:]
large[:,-1] = large[:,-2]
return large

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接