任何人都可以解释这个python代码如何逐行工作?

时间:2011-05-22 05:50:13

标签: python image-processing numpy 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

非常感谢。

1 个答案:

答案 0 :(得分:4)

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

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,行刻度设置为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

我不是100%肯定最后两行没有返回并查看griddata方法返回的内容。它似乎丢弃了一些图像不需要或执行翻译的额外数据。

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