Может кто-нибудь объяснить, как этот код Python работает построчно? - PullRequest
3 голосов
/ 22 мая 2011

Я сейчас работаю над обработкой изображений в Python, используя numpy и scipy все время.У меня есть один фрагмент кода, который может увеличить изображение, но я не уверен, как это работает.

Так что, пожалуйста, какой-нибудь эксперт по scipy / numpy в python может объяснить мне построчно.Я всегда готов учиться.

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 Ответ

4 голосов
/ 22 мая 2011

Сначала создается сетка пустых точек с точкой на пиксель.

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

Я не уверен на 100%, что делают последние две строки, не возвращаясь и не смотря на то, что возвращает метод griddata. Кажется, он выбрасывает некоторые дополнительные данные, которые не нужны для изображения, или выполняет перевод.

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