Кто-нибудь может, пожалуйста, объяснить, как этот код на python работает построчно?

#python #image-processing #numpy #scipy

#python #обработка изображений #numpy #scipy

Вопрос:

Я сейчас работаю над обработкой изображений на 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. Отступ каждого оператора в Python имеет большое значение. Пожалуйста, исправьте форматирование вашего фрагмента кода.

2. Спасибо и извините за это. Я добавил эти импортные файлы .. чтобы было понятно

3. Обратите внимание, что использование griddata здесь не самый эффективный вариант, поскольку сетка всегда прямоугольная. Более эффективными вариантами были бы: scipy.interpolate.RectBivariateSpline и scipy.ndimage.zoom .

Ответ №1:

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

 x, y = N.meshgrid(N.arange(img.shape[1]), N.arange(img.shape[0]))
  

Фактические пиксели изображения помещаются в переменную pts , которая понадобится позже.

 pts = N.column_stack((x.ravel(), y.ravel()))
  

После этого он создает сетку mesh с одной точкой на пиксель для увеличенного изображения; если исходное изображение было 200×400, colscale установлено на 4, а rowscale — на 2, сетка mesh имела бы (200 * 4) x (400 * 2) или 800×800 точек.

 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