【问题标题】:Can anyone please explain how this python code works line by line?谁能逐行解释这个python代码是如何工作的?
【发布时间】:2011-05-22 05:50:12
【问题描述】:

我现在一直在使用 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

非常感谢。

【问题讨论】:

  • Python 中每条语句的缩进很重要。请修正您的代码 sn-p 的格式。
  • 对此表示感谢和抱歉。我添加了那些 import .. 以使其清楚
  • 请注意,这里使用griddata 并不是最有效的选择,因为网格始终是矩形的。更有效的选择是:scipy.interpolate.RectBivariateSplinescipy.ndimage.zoom

标签: python image-processing numpy scipy


【解决方案1】:

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

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 方法返回的内容,我不能 100% 确定最后两行的作用。它似乎丢弃了一些图像不需要的额外数据或执行翻译。

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

【讨论】:

    猜你喜欢
    • 2018-12-24
    • 2015-06-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多