#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