Есть ли какой-либо синоним python (numpy) для i-переменных (например, irow, iradius, itheta и т. д.) в сценариях DM?

Я работаю с обработкой изображений для электронной микроскопии, в основном со сценариями для цифровой микроскопии (DM), и недавно начал изучать Python из-за его более широкой универсальности, богатых открытых библиотек и кросс-платформенных возможностей.

Кто-нибудь знает, есть ли в Python (numpy) какие-либо аналогичные инструменты для индексации массивов 2D (изображение) или 3D (изображение спектра), подобных i-переменным DM?

i-переменные кратко представлены на странице 11 этого руководства по сценариям DM: http://portal.tugraz.at/portal/page/portal/Files/felmi/images/DM-Script/DM-basic-scripting_bs.pdf

Это простой способ индексировать любой похожий на изображение 2D- или 3D-объект, что очень удобно для обработки изображений, например, для создания функций маски.

Например, следующий DM-скрипт

image t1 := RealImage ("test1", 4, 5, 5)
image t2 := RealImage ("test2", 4, 5, 5)
image t3 := RealImage ("test3", 4, 5, 5)
t1 = irow   
// the value in each pixel equals to the row index
t2 = iradius  
// the value in each pixel equals to the radius 
// (i.e., distance to the center pixel)
t3 = itheta  
// the value in each pixel quals to the angle (radian)
// to the center pixel (i.e., angle in polar representation) 
t1.showimage(); t2.showimage(); t3.showimage()

привести к следующим изображениям (выраженным здесь в электронной таблице или, скажем, в матричной форме):

t1 = 
0   0   0   0   0
1   1   1   1   1
2   2   2   2   2
3   3   3   3   3
4   4   4   4   4

t2=
3.5355339   2.9154758   2.5495098   2.5495098   2.9154758
2.9154758   2.1213202   1.5811388   1.5811388   2.1213202
2.5495098   1.5811388   0.70710677  0.70710677  1.5811388
2.5495098   1.5811388   0.70710677  0.70710677  1.5811388
2.9154758   2.1213202   1.5811388   1.5811388   2.1213202

t3=
-2.3561945  -2.1112158  -1.7681919  -1.3734008  -1.0303768
-2.6011732  -2.3561945  -1.8925469  -1.2490457  -0.78539819
-2.9441972  -2.8198421  -2.3561945  -0.78539819 -0.32175055
2.9441972   2.8198421   2.3561945   0.78539819  0.32175055
2.6011732   2.3561945   1.8925469   1.2490457   0.78539819

person w4m    schedule 16.08.2015    source источник
comment
Было бы полезно, если бы вы кратко объяснили, что это такое и как вы хотите их использовать.   -  person BrenBarn    schedule 17.08.2015


Ответы (2)


Эквивалентный способ сделать это в NumPy — использовать numpy.indices функция.

Итак, чтобы сделать то же самое в NumPy, что и в DM (помните, что координаты всегда (y, x) в numpy, и этот irow, скажем, является индексом y-координат):

from __future__ import division
import numpy as np

test1 = np.random.random((5,5))
irow, icol = np.indices(test1.shape)

# to use iradius and itheta we need to get icol, irow centered
irow_centered = irow - test1.shape[0] / 2.0
icol_centered = icol - test1.shape[1] / 2.0

iradius = (icol_centered**2 + irow_centered**2)**0.5
itheta = np.arctan2(irow_centered, icol_centered)

затем

>>> irow
array([[0, 0, 0, 0, 0],
       [1, 1, 1, 1, 1],
       [2, 2, 2, 2, 2],
       [3, 3, 3, 3, 3],
       [4, 4, 4, 4, 4]])
>>> iradius
array([[ 3.53553391,  2.91547595,  2.54950976,  2.54950976,  2.91547595],
       [ 2.91547595,  2.12132034,  1.58113883,  1.58113883,  2.12132034],
       [ 2.54950976,  1.58113883,  0.70710678,  0.70710678,  1.58113883],
       [ 2.54950976,  1.58113883,  0.70710678,  0.70710678,  1.58113883],
       [ 2.91547595,  2.12132034,  1.58113883,  1.58113883,  2.12132034]])
>>> itheta
array([[-2.35619449, -2.11121583, -1.76819189, -1.37340077, -1.03037683],
       [-2.60117315, -2.35619449, -1.89254688, -1.24904577, -0.78539816],
       [-2.94419709, -2.8198421 , -2.35619449, -0.78539816, -0.32175055],
       [ 2.94419709,  2.8198421 ,  2.35619449,  0.78539816,  0.32175055],
       [ 2.60117315,  2.35619449,  1.89254688,  1.24904577,  0.78539816]])

Это также можно сделать с помощью mgrid и < функции href="http://docs.scipy.org/doc/numpy/reference/generated/numpy.ogrid.html" rel="nofollow">ogrid. mgrid вернет координаты в полностью заполненном массиве (той же формы, что и исходное изображение, идентично numpy.indices), а ogrid вернет векторы строк и столбцов правильной формы, которые часто автоматически транслируются правильно.

Если вы используете это для создания масок для преобразованных Фурье изображений, есть также np.fft.fftfreq, которая даст вам частоты пикселей в преобразовании Фурье. Я использую следующее, чтобы получить квадрат частоты для каждого пикселя для заданной формы изображения:

def get_freq_squared(shape, packed_complex=True):
    """Return the frequency squared for an n-d array.
    The returned image will match shape, if packed_complex is true the last
    dimension will be treated as 0,f,...,nf rather than 0,f,..., nf,...,-f
    """
    vecs = [np.fft.fftfreq(s, 1.0 / s) ** 2 for s in shape]

    if packed_complex:
        s = shape[-1]
        olds = (s-1)*2
        vecs[-1] = rfftfreq(olds, 1.0/olds)**2
    return reduce(np.add.outer, vecs)
person MattM    schedule 18.08.2015
comment
Из интереса: как соотносятся скорости изменения 3D-данных с использованием скрипта DM и выражений icol,irow,iplane и выполнения аналогичных действий с помощью предлагаемых методов Python? (Предполагается типичный размер SI, скажем, 256x256x1024.) - person BmyGuest; 21.08.2015
comment
Я только что обнаружил numpy.indices(shape), который фактически такой же, как np.mgrid[0:shape[0], 0:shape[1]], поэтому обновлю ответ, чтобы использовать этот - person MattM; 03.08.2016

Pillow использует пустые массивы IIRC. Scipy имеет некоторые возможности для работы с изображениями, но плохо загружает и сохраняет изображения.

person Joonazan    schedule 16.08.2015