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)
非常感谢。
首先,创建一个空点网格,每个像素点。
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)