Quando os pixels da imagem são armazenados de forma contígua na forma raster unidimensional, o cálculo da indexação N-dimensional $(n_0, n_1, ..., n_{N-1})$ é dada pelo offset:
$$ n_{\mathrm{offset}} = K_{\mathrm{offset}} + \sum_{k=0}^{N-1} s_k n_k $$onde $s_k$ é o stride da dimensão $k$.
Neste notebook iremos verificar como o stride e $K_{offset}$ são modificados para implementar operações como espelhamento e transposta.
In [1]:
import numpy as np
Vamos criar um array com 4 linhas e 6 colunas criados com o arange
assim, o valor de cada pixel é o valor de seu offset raster unidimensional:
In [2]:
H,W = (4,6)
a = np.arange(H*W).reshape(H,W).astype(np.uint8)
print(a)
print(a.size)
In [3]:
print(a.strides)
Assim, a indexação [2,3] é igual ao 15:
In [4]:
a[2,3]
Out[4]:
In [5]:
(a.strides * np.array([2,3])).sum()
Out[5]:
In [8]:
Rows = np.arange(H)
Cols = np.arange(W)
index = []
for i in Rows:
for j in Cols:
index.append([i,j])
print(index)
index_all = np.array(index)
print(index_all)
In [9]:
i = (a.strides * index_all).sum(axis=1)
print(i)
In [10]:
b = a[::-1,:]
print(b.strides)
print(b.size)
print(b.ravel())
In [11]:
b[2,1]
Out[11]:
In [12]:
np.sum(b.strides * np.array([2,1])) + b.size- b.shape[1]
Out[12]:
In [13]:
(b.strides * index_all).sum(axis=1) + b.size - b.shape[1]
Out[13]:
In [14]:
c = a.T
print(c)
print(c.strides)
print(c.ravel())
In [65]:
(c.strides * index_all).sum(axis=1)
Out[65]:
d
usado para subamostrar uma imagem utilizando o fatiamento: d = a[::2,::2]