谁能解释一下这个python代码是如何一行一行地工作的?

Hol*_*ger 3 python numpy image-processing scipy

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

所以请一些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
Run Code Online (Sandbox Code Playgroud)

非常感谢。

Eri*_*itt 5

首先,创建一个空点网格,每个像素点。

x, y = N.meshgrid(N.arange(img.shape[1]), N.arange(img.shape[0]))
Run Code Online (Sandbox Code Playgroud)

实际的图像像素被放入pts稍后需要的变量中。

pts = N.column_stack((x.ravel(), y.ravel()))
Run Code Online (Sandbox Code Playgroud)

之后,它为放大的图像创建一个每个像素一个点的网格;如果原始图像为 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)]
Run Code Online (Sandbox Code Playgroud)

使用 scipy,pts变量中的点被插入到更大的网格中。插值是在从较小的点集到较大的点集时填充或估计缺失点的方式。

large = scipy.interpolate.griddata(pts, img.flatten(), (xx, yy), method).T
Run Code Online (Sandbox Code Playgroud)

如果不回去查看 griddata 方法返回的内容,我不能 100% 确定最后两行做了什么。它似乎丢弃了图像或执行翻译不需要的一些额外数据。

large[-1,:] = large[-2,:]
large[:,-1] = large[:,-2]
return large
Run Code Online (Sandbox Code Playgroud)