PyCCA: mudanças entre as edições
Sem resumo de edição |
|||
(9 revisões intermediárias por 3 usuários não estão sendo mostradas) | |||
Linha 14: | Linha 14: | ||
numero_de_nos = 50; # numero de agentes | numero_de_nos = 50; # numero de agentes | ||
total_time = 500; # total time steps | total_time = 500; # total time steps | ||
a = np.random.randint(0,2,(numero_de_nos,numero_de_nos)); # random graph | a = np.random.randint(0,2,(numero_de_nos,numero_de_nos)); # random graph (4*) | ||
randomnet = (a + a.T)/2 + (a + a.T)%2 - np.diag(np.diag((a + a.T)/2 + (a + a.T)%2)); # symmetrical adjacency matrix or it will be a digraph, diagonal subtracted for no auto interactions | randomnet = (a + a.T)/2 + (a + a.T)%2 - np.diag(np.diag((a + a.T)/2 + (a + a.T)%2)); # symmetrical adjacency matrix or it will be a digraph, diagonal subtracted for no auto interactions (4*) | ||
fields = np.random.rand(numero_de_nos); # node fields, or agents atributs | fields = np.random.rand(numero_de_nos); # node fields, or agents atributs (2*) | ||
nonz = randomnet.nonzero(); # 2 dim-tuple with array counting indexes of connected nodes | nonz = randomnet.nonzero(); # 2 dim-tuple with array counting indexes of connected nodes | ||
nonznum = len(nonz[0][:]); # number of edges | nonznum = len(nonz[0][:]); # number of edges | ||
edges = [(nonz[0][v],nonz[1][v]) for v in range(nonznum)]; # the edges of the random graph | edges = [(nonz[0][v],nonz[1][v]) for v in range(nonznum)]; # the edges of the random graph | ||
interact = 0; # interaction process, the mean of the two field | interact = 0; # interaction process, the mean of the two field in this case | ||
while total_time > 0: | while total_time > 0: | ||
sorteio_interacao = np.random.randint(0,nonznum,(1)); # the edge(interaction) sampling process | sorteio_interacao = np.random.randint(0,nonznum,(1)); # the edge(interaction) sampling process (1*) | ||
interact = float(fields[edges[sorteio_interacao[0]][0]]+fields[edges[sorteio_interacao[0]][1]])/2; | interact = float(fields[edges[sorteio_interacao[0]][0]]+fields[edges[sorteio_interacao[0]][1]])/2; # (3*) | ||
fields[edges[sorteio_interacao[0]][0]] = float(fields[edges[sorteio_interacao[0]][0]] + interact)/2; | fields[edges[sorteio_interacao[0]][0]] = float(fields[edges[sorteio_interacao[0]][0]] + interact)/2; # (2*) (3*) | ||
fields[edges[sorteio_interacao[0]][1]] = float(fields[edges[sorteio_interacao[0]][1]] + interact)/2; | fields[edges[sorteio_interacao[0]][1]] = float(fields[edges[sorteio_interacao[0]][1]] + interact)/2; # (2*) (3*) | ||
print fields; | print fields; | ||
total_time = total_time - 1; | total_time = total_time - 1; | ||
Linha 33: | Linha 33: | ||
Notas | Notas | ||
* Neste exemplo agentes interagem com igual probabilidade P = 1/(numero de arestas na rede), ou seja igual probabilidade; | *1* Neste exemplo agentes interagem com igual probabilidade P = 1/(numero de arestas na rede), ou seja igual probabilidade; | ||
* Cada agente tem uma propriedade, numero real, alocado em fields; | *2* Cada agente tem uma propriedade, numero real, alocado em fields; | ||
* A interacao eh um filtro de altas frequencias no atributo do no/agente, ou seja a interacao e homofilica/homogeinizadora; | *3* A interacao eh um filtro de altas frequencias no atributo do no/agente, ou seja a interacao e homofilica/homogeinizadora; | ||
* A rede eh aleatoria. | *4* A rede eh aleatoria. | ||
* Para gerar modelo de agentes em redes complexas diferente, mais realista, eh necessario generalizar qualquer um destes pontos. | *5* Para gerar modelo de agentes em redes complexas diferente, mais realista, eh necessario generalizar qualquer um destes pontos no local indicado no codigo atraves dos numeros das notas. | ||
== Processamento de Imagens == | == Processamento de Imagens == | ||
Linha 54: | Linha 54: | ||
<pre> | <pre> | ||
im_cinza = im.convert('L') | im_cinza = im.convert('L') | ||
</pre> | |||
=== Como acessar cada canal de cor da imagaem? === | |||
<pre> | |||
im_r = im.split()[0] | |||
im_g = im.split()[1] | |||
im_b = im.split()[2] | |||
</pre> | </pre> | ||
Linha 97: | Linha 105: | ||
energias = fftpack.fft2(im_cinza).real**2 + fftpack.fft2(im_cinza).imag**2 | energias = fftpack.fft2(im_cinza).real**2 + fftpack.fft2(im_cinza).imag**2 | ||
</pre> | </pre> | ||
Calculando a energia de janelas de uma imagem, determinadas em um particionamento em grade da imagem. A recomposicao da imagem original (s[0] x s[1]) e feita mas agora no espaco de frequencias bi-dimensionais. | |||
<pre> | |||
from scipy import fftpack | |||
import Image | |||
import numpy as np | |||
img = Image.open('/r.0.jpg'); | |||
img = img.convert('L'); | |||
s = [img.size[0], img.size[1]]; | |||
pttlen = 80; # numero de blocos por dimensao da particao na imagem (total pttlen x pttlen = 6400 neste caso) | |||
arr = np.array(list(img.getdata())); | |||
arr = arr.reshape((800,800)); | |||
energia = dict( [[(i,j), np.log(fftpack.fft2(arr[i*s[0]/pttlen:(i+1)*s[0]/pttlen,j*s[1]/pttlen:(j+1)*s[1]/pttlen]).real**2 + fftpack.fft(arr[i*s[0]/pttlen:(i+1)*s[0]/pttlen,j*s[1]/pttlen:(j+1)*s[1]/pttlen]).imag**2)] for i in range(pttlen) for j in range(pttlen)]); | |||
# This rebuilds the original imagem in the frequency domain of window length (s[0]/pttlen)x(s[1]/pttlen) | |||
fourierimage = Image.new('L',(s[0],s[1]),255); | |||
for v in energia.keys(): | |||
b0 = Image.new('L',(s[0]/pttlen,s[1]/pttlen),255); | |||
data = energia[v]; | |||
data = data.reshape(-1); | |||
data = data.tolist(); | |||
b0.putdata(data); | |||
fourierimage.paste(b0,(v[0]*(s[0]/pttlen),v[1]*(s[1]/pttlen))) | |||
fourierimage.show(); | |||
</pre> | |||
=== Como calcular convex hull de uma imagem binária? === | |||
Convex hull preenche as regiões convexas de uma imagem binária, gerando uma "mancha", sem essas concavidades. A razão entre a área da imagem original e a área encontrada pelo convex hull é uma boa medida para determinar o quanto uma região é circular ou não. Quanto mais circular, mais próximo de 1.0. | |||
https://gist.github.com/automata/5303516 | |||
=== Dilatação em imagem em escala de cinza? === | |||
Para dilatação binária, use binary_dilation ao invés de grey_dilation. | |||
https://gist.github.com/automata/09050f23ac3e1e63e7d1 | |||
== Processamento de Áudio e Música == | == Processamento de Áudio e Música == | ||
Linha 103: | Linha 151: | ||
[[Category:Lab_Macambira, AudioArt, Python]] | [[Category:Lab_Macambira, AudioArt, Python]] | ||
=== Dividir uma imagem em canais RGB === | |||
<pre> | |||
import Image | |||
lena = Image.open("lena.png") | |||
r, g, b = lena.split() | |||
</pre> | |||
em alguns casos, as imagens vem com o canal alpha adicionado. Nesse caso faca: | |||
<pre> | |||
r,g,b,alpha = lena.split() | |||
</pre> | |||
ou | |||
<pre> | |||
lena = lena.convert("RGB") | |||
r, g, b = lena.split() | |||
</pre> | |||
[[Categoria:Audio]] |
Edição atual tal como às 16h27min de 27 de maio de 2014
Python, Computação Científica e Aplicações
FAQ/Tutorial sobre achados e notas nas aplicações de Python para Computação Científica.
Redes Complexas
((( Ver também ARS )))
Como simular agentes difusores aleatorios ?
import numpy as np numero_de_nos = 50; # numero de agentes total_time = 500; # total time steps a = np.random.randint(0,2,(numero_de_nos,numero_de_nos)); # random graph (4*) randomnet = (a + a.T)/2 + (a + a.T)%2 - np.diag(np.diag((a + a.T)/2 + (a + a.T)%2)); # symmetrical adjacency matrix or it will be a digraph, diagonal subtracted for no auto interactions (4*) fields = np.random.rand(numero_de_nos); # node fields, or agents atributs (2*) nonz = randomnet.nonzero(); # 2 dim-tuple with array counting indexes of connected nodes nonznum = len(nonz[0][:]); # number of edges edges = [(nonz[0][v],nonz[1][v]) for v in range(nonznum)]; # the edges of the random graph interact = 0; # interaction process, the mean of the two field in this case while total_time > 0: sorteio_interacao = np.random.randint(0,nonznum,(1)); # the edge(interaction) sampling process (1*) interact = float(fields[edges[sorteio_interacao[0]][0]]+fields[edges[sorteio_interacao[0]][1]])/2; # (3*) fields[edges[sorteio_interacao[0]][0]] = float(fields[edges[sorteio_interacao[0]][0]] + interact)/2; # (2*) (3*) fields[edges[sorteio_interacao[0]][1]] = float(fields[edges[sorteio_interacao[0]][1]] + interact)/2; # (2*) (3*) print fields; total_time = total_time - 1;
Notas
- 1* Neste exemplo agentes interagem com igual probabilidade P = 1/(numero de arestas na rede), ou seja igual probabilidade;
- 2* Cada agente tem uma propriedade, numero real, alocado em fields;
- 3* A interacao eh um filtro de altas frequencias no atributo do no/agente, ou seja a interacao e homofilica/homogeinizadora;
- 4* A rede eh aleatoria.
- 5* Para gerar modelo de agentes em redes complexas diferente, mais realista, eh necessario generalizar qualquer um destes pontos no local indicado no codigo atraves dos numeros das notas.
Processamento de Imagens
((( Ver também PythonImagem )))
Como abrir uma imagem?
from PIL import Image im = Image.open('foo.jpg')
Como converter em escala de cinza?
im_cinza = im.convert('L')
Como acessar cada canal de cor da imagaem?
im_r = im.split()[0] im_g = im.split()[1] im_b = im.split()[2]
Como equalizar uma imagem por histograma?
from PIL import ImageOps im_eq = ImageOps.equalize(im_cinza)
Como aplicar uma função qualquer com janelamento de 3x3? Ou, como aplicar um filtro qualquer com janelamento?
No caso, vamos aplicar a função entropia em cada pixel da imagem. A função entropia recebe como argumento os 9 vizinhos do pixel, já que o tamanho da janela (argumento size da função generic_filter) é equivalente a 3. A função entropia retorna o novo valor do pixel.
from scipy import ndimage def entropia(viz): viz = list(viz) qtd = [viz.count(x) for x in viz] prob = [viz[i]/qtd[i] for i in range(len(viz))] return n.sum([-x*n.log(x) for x in prob if x != 0]) im_entropia = ndimage.generic_filter(im_cinza, entropia, size=3)
Como calcular o valor de entropia de uma imagem inteira?
def entropia(im, nbr_bins=256): hist = im.histogram() hist_length = sum(hist) samples_probability = [float(h) / hist_length for h in hist] return sum([-p * log(p) for p in samples_probability if p != 0]) v_entropia = entropia(im_cinza)
Como calcular os valores de energia de uma imagem?
from scipy import fftpack energias = fftpack.fft2(im_cinza).real**2 + fftpack.fft2(im_cinza).imag**2
Calculando a energia de janelas de uma imagem, determinadas em um particionamento em grade da imagem. A recomposicao da imagem original (s[0] x s[1]) e feita mas agora no espaco de frequencias bi-dimensionais.
from scipy import fftpack import Image import numpy as np img = Image.open('/r.0.jpg'); img = img.convert('L'); s = [img.size[0], img.size[1]]; pttlen = 80; # numero de blocos por dimensao da particao na imagem (total pttlen x pttlen = 6400 neste caso) arr = np.array(list(img.getdata())); arr = arr.reshape((800,800)); energia = dict( [[(i,j), np.log(fftpack.fft2(arr[i*s[0]/pttlen:(i+1)*s[0]/pttlen,j*s[1]/pttlen:(j+1)*s[1]/pttlen]).real**2 + fftpack.fft(arr[i*s[0]/pttlen:(i+1)*s[0]/pttlen,j*s[1]/pttlen:(j+1)*s[1]/pttlen]).imag**2)] for i in range(pttlen) for j in range(pttlen)]); # This rebuilds the original imagem in the frequency domain of window length (s[0]/pttlen)x(s[1]/pttlen) fourierimage = Image.new('L',(s[0],s[1]),255); for v in energia.keys(): b0 = Image.new('L',(s[0]/pttlen,s[1]/pttlen),255); data = energia[v]; data = data.reshape(-1); data = data.tolist(); b0.putdata(data); fourierimage.paste(b0,(v[0]*(s[0]/pttlen),v[1]*(s[1]/pttlen))) fourierimage.show();
Como calcular convex hull de uma imagem binária?
Convex hull preenche as regiões convexas de uma imagem binária, gerando uma "mancha", sem essas concavidades. A razão entre a área da imagem original e a área encontrada pelo convex hull é uma boa medida para determinar o quanto uma região é circular ou não. Quanto mais circular, mais próximo de 1.0.
https://gist.github.com/automata/5303516
Dilatação em imagem em escala de cinza?
Para dilatação binária, use binary_dilation ao invés de grey_dilation.
https://gist.github.com/automata/09050f23ac3e1e63e7d1
Processamento de Áudio e Música
((( Ver também PythonMusica, AudioArt, Massa )))
Dividir uma imagem em canais RGB
import Image lena = Image.open("lena.png") r, g, b = lena.split()
em alguns casos, as imagens vem com o canal alpha adicionado. Nesse caso faca:
r,g,b,alpha = lena.split()
ou
lena = lena.convert("RGB") r, g, b = lena.split()