Duas dicas valiosas para quem trabalha com processamento digital de imagens

Quando falamos em processamento digital de imagens, tipicamente estamos falando de processamento de matrizes, afinal, qualquer imagem pode ser representada computacionalmente por uma matriz de pixels.

E se você está iniciando sua aventura na área de processamento digital de imagens, seguem duas dicas valiosas, dois hábitos que você deveria adquirir enquanto trilhar este caminho.

São duas dicas bastante simples, que de tão simples eu sempre tive a tendência de deixá-las de lado em prol de codificar e obter resultados mais rapidamente. Agora, com mais experiência na área e necessidade de processamento de uma grande massa de dados, eu diria que estas práticas fazem parte do meu manual de sobrevivência.

São elas:

  1. Teste cada passo de seu algoritmo com matrizes pequenas.
  2. Olhe para todo o LOOP FOR e pergunte a si mesmo, como posso substituí-lo por algo mais eficiente?

Para ilustrar estas práticas, proponho um pequeno exercício, implementado em Python (utilizando a biblioteca Numpy), onde temos uma matriz com M e N colunas e deseja-se subtrair um vetor de N elementos de todas as linhas desta matriz.

O primeiro passo é criar uma matriz de tamanho pequeno, que será utilizada como prova de conceito.

import numpy as np
# Inicializando uma matriz 3 x 4
A=np.asarray(range(1,13))
A=A.reshape(3,4)
print "Matriz A:"
print A
print '\n'

Agora, vamos criar um vetor “b” com 4 elementos.

# Inicializando um vetor de 4 elementos
b=np.asarray([1,2,3,4])
print "Vetor B:"
print b
print '\n'

Vamos implementar a subtração, utilizando um LOOP FOR e vamos medir o tempo da operação utilizando a função time.

import time
print "Subtraindo \'b\' de todas as linhas de \'A\' usando um loop for."
start=time.time()
# Usando um loop
D=np.asarray(np.zeros(A.shape),dtype=np.int64)
for i in range(A.shape[0]):
    D[i,:]=A[i,:]-b
end=time.time()
print "Resultado:"
print D
print "Tempo de execução da operação: "+str(end-start)
print '\n'

E finalmente, uma implementação alternativa na qual o LOOP FOR é substituído pela indexação feita por um vetor de índices.

print "Subtraindo \'b\' de todas as linhas de \'A\' usando indexação."
 start=time.time()
 # Usando indexação
 D=A[range(A.shape[0])]-b
 end=time.time()
 print "Resultado:"
 print D
 print "Tempo de execução da operação: "+str(end-start)

A execução de todos os passos do script apresenta o seguinte resultado:

>>>
 Matriz A:
 [[ 1  2  3  4]
 [ 5  6  7  8]
 [ 9 10 11 12]]
Vetor B:
 [1 2 3 4]
Subtraindo 'b' de todas as linhas de 'A' usando um loop for.
 Resultado:
 [[0 0 0 0]
 [4 4 4 4]
 [8 8 8 8]]
 Tempo de execução da operação: 0.0231280326843
Subtraindo 'b' de todas as linhas de 'A' usando indexação.
 Resultado:
 [[0 0 0 0]
 [4 4 4 4]
 [8 8 8 8]]
 Tempo de execução da operação: 0.000221967697144
 >>>

Observe que o tempo de execução da implementação sem o LOOP FOR foi muito menor.

A eficiência da implementação sem o LOOP FOR será tão mais evidente quanto maior o número de dimensões da matriz (imagem) a ser processada.

É importante observar que o código fica um pouco mais encriptado quando se utiliza indexação implícita. Às vezes é mais fácil interpretar o que um LOOP FOR está fazendo. Por isso, use e abuse dos comentários para ajudar quem quiser entender seu código.

Obviamente, não é apenas o Python/Numpy que permite realizar este tipo de indexação. Linguagens como Matlab e R também possuem mecanismos de evitar o LOOP FOR. É importante entender que nestes casos um LOOP FOR ainda continua sendo executado em mais baixo nível (não há como escapar disso). A única coisa que você está fazendo ao utilizar os mecanismos de indexação implícita de uma linguagem é se aproveitar de funções que já estão compiladas em mais baixo nível e que portanto executarão mais eficientemente.

Resumindo, sempre vale à pena deixar a preguiça de lado (sim, eu sei o que é isso) e se esforçar para aprender os mecanismos de indexação que a linguagem disponibiliza. Segue um link para começar este estudo no Python.

Anúncios

Deixe seu comentário

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s