SlideShare una empresa de Scribd logo
Primeros pasos con Python:
Manipulando imágenes
Rodolfo Ferro
@FerroRodolfo
Abril 29, 2017
Universidad de Guanajuato
CIMAT A.C.
Tabla de contenido
1. Sobre Python
2. Instalación
3. Primeros pasos
4. Manipulando imágenes
5. Creando imágenes
1
Sobre Python
Python es un lenguaje interpretado, sencillo,
versátil y poderoso. La belleza del lenguaje
radica en su sintaxis.
1
Un poco de historia (I)
• Python fue creado a inicios de los 90’s por Guido van
Rossum en el Stichting Mathematisch Centrum (CWI), en
los Países Bajos, como un sucesor del lenguaje ABC.
• Guido sigue siendo el principal autor, aunque incluye
muchas contribuciones por parte de otros.
2
Un poco de historia (II)
• En mayo del 2000, Guido y el equipo core de desarrollo de
Python se mudan a BeOpen.com para formar el equipo
BeOpen PythonLabs.
• En octubre del mismo año, los PythonLabs se mudan a
Digital Creations (hoy Zope Corporation) y en 2001 se crea
la Python Software Foundation (PSF), una organización sin
fines de lucro creada específicamente para poseer todo lo
relacionado con propiedad intelectual sobre Python.
3
Python en el mundo del SL
• Todos los releases de Python son Open Source.
• De acuerdo a la Free Software Foundation:
4
Recordando un poco...
Un Software Libre es aquel que respeta las cuatro libertades
que la FSF establece:
• La libertad de usar el programa con cualquier propósito.
• La libertad de estudiar cómo funciona el programa y
modificarlo, adaptándolo a tus necesidades.
• La libertad de distribuir copias del programa, con lo cual
puedes ayudar a tu prójimo.
• La libertad de mejorar el programa y hacer públicas esas
mejoras a los demás, de modo que toda la comunidad se
beneficie.
Nota: El Software Libre no es necesariamente gratuito.
5
Instalación
Instalando Python
• Ir al sitio oficial: https://www.python.org/downloads/
• Descargar la versión 3.6.x.
6
Instalando Python
En Windows:
• Preferentemente instalarlo en el disco local C://.
• Dar check a la opción ”Add Python to PATH”.
En Linux/Unix:
• No hace falta algo adicional, todo es hermoso.
• Es más, por default ya viene instalada la versión 2.7 de
Python.
7
Instalando paquetes
Al instalar Python, se instala pip (Python Package Index), que
es un gestor de paquetes de Python. Usando pip
instalaremos:
• NumPy, que incluye herramientas de métodos numéricos.
• Matplotlib, que incluye herramientas de visualización.
Nota: Python se instala con su librería estándar. Lo
recomendable es instalar una distribución (como Anaconda)
para una mejor gestión de paquetes, además de instalarse por
default los más usados.
8
Paquetes de manipulación de imágenes
Existen diversos paquetes para manipular imágenes:
• PIL (Python Imaging Library)
• OpenCV (OpenSource Computer Vision)
• scikit-image (Scientific Kit - Image)
• Etc.
Cada uno trata de manera distinta las imágenes y se enfocan
en cosas diferentes. Como es un taller de primeros pasos, no
usaremos alguno de estos paquetes, sino que trabajaremos
desde cero, sólo con numpy y matplotlib.
9
Instalando numpy y matplotlib
Abriremos una consola y ejecutaremos los siguientes
comandos.
Para instalar numpy:
$ sudo pip install numpy
Para instalar matplotlib:
$ sudo pip install matplotlib
Nota: En Windows se omite el comando sudo.
10
Primeros pasos
El prompt de Python
11
Lo básico (I)
La belleza de Python radica en la sintaxis, los bloques de
código deben tener la misma indentación, pues las llaves { } se
utilizan para una estructura de datos (diccionarios).
Un ejemplo:
while True:
# El bloque de código dentro del ciclo debe
# estar en el mismo nivel de indentación
print("Infinite loop.")
12
Lo básico (II)
• No hace falta terminar cada línea con punto y coma.
• Los scripts de Python pueden ejecutarse desde consola,
usando un IDE o con Jupyter notebooks.
• Todos los scripts de Python deben ser de extensión .py
(excepto por los Jupyter notebooks).
• Para fines prácticos, nosotros correremos scripts desde
consola y escribiremos código desde un bloc de notas,
por lo que es recomendable instalar uno tipo Atom o
Sublime Text.
13
Variables y operaciones (I)
• Las variables no se declaran, sólo se definen y Python
sabe el tipo de variable que se está utilizando.
• Python cuenta con 5 tipos de datos estándar: números,
cadenas de texto, listas, tuplas y diccionarios.
• Puedes realizar asignación múltiple.
• Las operaciones básicas con números son: +, -, *, /, //, **.
• En las cadenas de texto también puede usarse +
(concatenación) y * (repetición).
14
Variables y operaciones (II)
Los tipos de variables que existen en Python son:
• Enteros, como 3.
• Longs, como 51924361L.
• Flotantes, como 3.14e4.
• Complejos, como 4.53-7j.
• Strings, como ”Hola mundo”.
• Listas, como [1., 3, 5.3, ”perrito”].
• Tuplas, como (1., 3, 5.3, ”perrito”).
• Diccionarios, como {”Nombre”:”Rodolfo”,
”Apellido”:”Ferro”}
15
Condicionales
La sintaxis correspondiente es:
if/elif/else
if condition:
# Block content
elif condition:
# Block content
else:
# Block content
16
Ciclos
La sintaxis correspondiente es:
for
for indx in iterable:
# Block content
while
while condition:
# Block content
17
Funciones
La sintaxis correspondiente es:
Funciones
def function_name(parameters):
# Block content
return values
No hay limitación en los parámetros y valores de retorno, en el
sentido de puede pasársele cualquier variable o función como
argumento y cualesquiera variables pueden ser retornadas en
una función.
18
Para concluir la sección...
Para poder concluir la sección y comenzar a tirar nuestras
primeras líneas de código en Python, tengamos claro lo
siguiente:
• ¿Qué es slicing?
• ¿Por qué conviene utilizar arreglos de NumPy en vez de
listas de Python?
• Computacionalmente, ¿qué es una imagen?
• ¿Cuántas dimensiones tiene una imagen?
• ¿Hay alguna otra pregunta?
19
Repositorio del taller:
https://github.com/RodolfoFerro/FLISoL17
En este punto, descargar solamente la carpeta
de imágenes.
19
Manipulando imágenes
Objetivos
Queremos ser capaces de recrear las siguientes imágenes:
20
Para ello...
Lo que necesitamos aprender es lo siguiente:
1. Desplegar una imagen
2. Operar una imagen
3. Realizar una transición de opacidad
4. Acceder a pixeles y subsecciones
5. Cortando imágenes
6. Programar derivadas
21
Importando NumPy y Matplotlib
Se pueden importar librerías simplemente haciendo import
librería, sin embargo, se pueden importar módulos
específicos (ej. from matplotlib import pyplot) o importar
módulos/librerías con un alias.
Por simpliacidad nosotros importaremos NumPy y Matplotlib
como sigue:
Importamos usando un alias:
import numpy as np
import matplotlib.pyplot as plt
22
1. Desplegando una imagen
Matplotlib tiene una función llamada imread, cuyo argumento
es una dirección y sirve para leer una imagen y guardarla
como un arreglo de NumPy.
Podemos imprimir la matriz usando la función print y
mostrarla en una ventana haciendo lo que sigue:
Después de importar...
img = plt.imread("../imgs/Lenna.png")
plt.imshow(img)
plt.show()
Script: show_img.py
23
2. Operando una imagen
Dado que las imágenes son matrices, es muy fácil operar
imágenes utilizando NumPy.
Basta hacer la operación directa en la imagen o utilizar alguna
función de NumPy para operar:
Después de importar y cargar una imagen inicial...
opr = img ** 0.5
opr = np.cos(img)
plt.imshow(opr)
plt.show()
Script: operating_imgs.py
24
3. Transición de opacidad
Una transición de opacidad para dos imágenes A y B está
definida como sigue:
op_img = (1 − α) A + α B,
tomando valores de α en el intervalo [0,1].
Por ejemplo el primer estado intermedio:
Habiendo cargado una imagen inicial y una final...
op_img = 0.7*im_i + 0.3*im_f
plt.imshow(op_img)
plt.show()
Script: opacity.py
25
4. Accediendo a pixeles y subsecciones
Dado que las imágenes son matrices, accedemos a un pixel
como si accediéramos a un elemento cualquiera de la matriz
que representa a la imagen:
pixel{i,j} = img[i, j]
De la misma manera, utilizando slicing podemos acceder a
regiones de la imagen:
region{X×Y} = img[yi : yj, xi : xj]
26
5. Cortando una imagen
Con lo anterior, es muy fácil cortar y obtener una nueva
imagen:
region{X×Y} = img[yi : yj, xi : xj],
simplemente hace falta guardar el resultado.
Habiendo importado librerías...
img = plt.imread("Lenna.png")
cropped_img = img[220:300, 210:370]
plt.imshow(cropped_img)
plt.show()
img = plt.imsave("Lenna.png", cropped_img)
Script: crop_img.py
27
6. Derivando una imagen
La derivada de una imagen no es más que un barrido
calculando las diferencias entre el pixel en el que te
encuentras y el anterior:
diffX = img[:, 1 : j] − img[:, 0 : j − 1]
diffY = img[1 : i, :] − img[0 : i − 1, :]
Con estas derivadas podemos construir una aproximación del
gradiente de una imagen:
grad ∼ (diff 2
X + diff 2
Y )0.5
Script: derivatives.py
28
Reto para llevar
Reto 1:
Dar formato a la transición de opacidad para que quede
como sigue:
29
Reto para llevar
Reto 2:
Nuestras funciones de derivadas de imagen funcionan sólo
con imágenes que son cuadradas, ¿por qué?
¿Cómo corregir esto para que sirva con la imagen leaf.png?
(HINT: Sobel operator.)
30
Para concluir la sección...
Para poder concluir la sección y continuar con la siguiente,
respondamos:
• ¿Resulta sencillo manipular imágenes (arreglos de NumPy,
en general)?
• ¿Por qué las derivadas de las imágenes ayudan a
encontrar bordes?
• ¿Hay alguna otra pregunta?
31
Creando imágenes
Objetivos
Queremos ser capaces de recrear las siguientes imágenes:
32
¿Por qué un fractal?
Como una imagen es una matriz, es muy fácil que seamos
capaces de crear una imagen con contenido basura, por lo que
resulta ser más interesante construir una imagen a partir de
un ente geométrico.
Primero necesitamos entender cómo se constrye un fractal, en
particular, el Conjunto de Mandelbrot.
33
Construyendo el conjunto de Mandelbrot (I)
Recordando que un complejo
es un número de la forma x + iy y
que tiene una representación en el plano;
el conjunto de Mandelbrot se construye
al iterar un número complejo z en la
función fc(z) = z2 + c, para un complejo c.
34
Construyendo el conjunto de Mandelbrot (II)
Por ejemplo, comenzando en z = 0 + i0 = 0, para el complejo
c = 0.25 + i0 = 0.25, tendríamos:
f0.25(0) = 02
+ 0.25 = 0.25
f0.25(0.25) = 0.252
+ 0.25 = 0.625 + 0.25 = 0.65
f0.25(0.65) = 0.652
+ 0.25 = 0.4225 + 0.25 = 0.4235
... =
...
De aquí podemos notar que la sucesión no crece
arbitrariamente. Sin embargo, ¿qué sucede con otros
números, como 1 (1 + i0)?
35
Construyendo el conjunto de Mandelbrot (III)
• La idea es crear una función que itere un complejo dado
hasta un máximo de iteraciones (en caso de no crecer
arbitrariamente).
• Teniendo dicha función, habrá que usarla dentro de otra
para que vaya recorriendo cada complejo en una región y
vaya creando el fractal.
Nota: El color del pixel en ese punto está asociado con el nivel
de iteración, por lo que será necesario tener una condición de
paro necesaria en caso de crecer arbitrariamente. Esta
condición de paro está relacionada con un acotamiento del
conjunto.
36
Código (I)
Función que itera:
def mandel(x, y, max_iters):
c = complex(x, y)
z = 0j
for i in range(max_iters):
z = z*z + c
if z.real * z.real + z.imag * z.imag >= 4:
return 255 * i // max_iters
return 255
Script: mandel.py
37
Código (II)
Función que calcula el fractal...
def create_fractal(min_x, max_x, min_y, max_y,
image, iters):
height = image.shape[0]
width = image.shape[1]
pixel_size_x = (max_x - min_x) / width
pixel_size_y = (max_y - min_y) / height
Script: mandel.py
38
Código (III)
...continuación:
for x in range(width):
real = min_x + x * pixel_size_x
for y in range(height):
imag = min_y + y * pixel_size_y
image[y, x] = color
return image
Script: mandel.py
39
Reto para llevar
Reto 3:
Construir un conjunto de Julia a partir del código mandel.py.
(Pueden revisar a @JuliaSetBot en Twitter para ver ejemplos
de conjuntos de Julia generados con sus respectivos
complejos.)
40
Para concluir la sección...
Para poder concluir la sección y continuar con la siguiente,
respondamos:
• ¿Qué sucede si iteramos otra función, en vez de
fc(z) = z2 + c?
• ¿Cómo se puede mejorar el código para más iteraciones?
• ¿Hay alguna otra pregunta?
41
¿Preguntas?
41
Referencias (I)
[1] Python Software Foundation.
History of the software.
History and Licence, disponible en
https://docs.python.org/3/license.html, 2017.
[2] Hipertextual.
¿Qué es Software Libre?
Diferencias entre Software Libre y Open Source, 2014.
[3] Hipertextual.
¿Qué es Open Source?
Diferencias entre Software Libre y Open Source, 2014.
42
Referencias (II)
[4] The Hitchhiker’s Guide to Python.
Python Imaging Library.
Image Manipulation, 2016.
[5] The Hitchhiker’s Guide to Python.
OpenSource Computer Vision.
Image Manipulation, 2016.
[6] Python Variable Types.
Tutorials Point.
Python Basic Tutorial.
43
Referencias (III)
[7] Image tutorial.
Importing image data into Numpy arrays.
matplotlib, disponible en
http://matplotlib.org/users/image_tutorial.html.
[8] Image tutorial.
Plotting numpy arrays as images.
matplotlib, disponible en
http://matplotlib.org/users/image_tutorial.html.
44
Referencias (IV)
[9] Complex number.
Complex number.
Wikipedia, the free encyclopedia, disponible en
https://en.wikipedia.org/wiki/Complex_number.
[10] The Mandelbrot Set.
The Mandelbrot Set - Numberphile.
Numberphile, disponible en
https://www.youtube.com/watch?v=NGMRB4O922I.
[11] IBM developerWorks.
How To Quickly Compute The Mandelbrot Set In Python.
JeanFrancoisPuget, 2015.
45
@FerroRodolfo
Repositorio del taller:
https://github.com/RodolfoFerro/FLISoL17
¡Gracias por su atención!
45

Más contenido relacionado

PPT
Estructura+del+sistema+mac+os+x
PPT
Sincronización entre procesos
PPTX
Procesos Planificacion de los Sistemas Operativos
PDF
Optimizacion de la busqueda de discos
PPTX
Metodo de montecarlo
PPTX
Ciclo de instrucciones CPU
PDF
Metodos de Programacion no lineal
PPTX
SERVICIOS DEL SISTEMA OPERATIVO
Estructura+del+sistema+mac+os+x
Sincronización entre procesos
Procesos Planificacion de los Sistemas Operativos
Optimizacion de la busqueda de discos
Metodo de montecarlo
Ciclo de instrucciones CPU
Metodos de Programacion no lineal
SERVICIOS DEL SISTEMA OPERATIVO

La actualidad más candente (20)

PDF
Sistemas estables
PPTX
Lenguajes de programacion tema 2_compiladores e interpretes
PPTX
Memorias semiconductoras
DOCX
Taxonomia de las herramientas case
PPTX
Método de Búsqueda Hash
PPTX
Algoritmos de gestión de memoria
PDF
El barbero-dormilón
PDF
Recurrencia en procesos
PPTX
Unidad 2 ensamblador
PPTX
Unidad 4 Interoperabilidad entre sistemas operativos
PPTX
Memoria dinamica
PPTX
Estructura de Datos - Unidad 6 Metodos de busqueda
PPTX
Arreglos c++
PPT
Rol del Analista de Sistemas
PPTX
Ejemplo Proyecto utilizando Uml
PPTX
Canva-
PDF
Estructura Repetitiva MIENTRAS (While) con PSeInt
DOCX
Recuperación de-datos-en-my sql
PDF
Simulacion de pi - monte carlo - buffon java
PDF
Tabla comparativa servidores web
Sistemas estables
Lenguajes de programacion tema 2_compiladores e interpretes
Memorias semiconductoras
Taxonomia de las herramientas case
Método de Búsqueda Hash
Algoritmos de gestión de memoria
El barbero-dormilón
Recurrencia en procesos
Unidad 2 ensamblador
Unidad 4 Interoperabilidad entre sistemas operativos
Memoria dinamica
Estructura de Datos - Unidad 6 Metodos de busqueda
Arreglos c++
Rol del Analista de Sistemas
Ejemplo Proyecto utilizando Uml
Canva-
Estructura Repetitiva MIENTRAS (While) con PSeInt
Recuperación de-datos-en-my sql
Simulacion de pi - monte carlo - buffon java
Tabla comparativa servidores web
Publicidad

Similar a Primeros pasos con Python: Manipulando imágenes ⟷ (20)

PPTX
introduccion a phyton, origen e historia del lenguaje de programación
PPTX
Python-Thonny programación avanzada TESE
PPTX
Python y la POO, en una clase, UNNe-Corrientes
PPTX
Introduccion a Python & Temas Basicos.pptx
PPSX
FUNDAMENTOS PYTHON.ppsx
PDF
python CIENTIFIFO.pdf
DOCX
Manual de python
PDF
Python_Module_01_Courtesy.pdf
PDF
Acceder a C desde Python (O viceversa)
PPT
programacion de sistemas de informacion.ppt
PDF
Primeros pasos en pyqt
PDF
Python power 1
ODP
Transparencias taller Python
PDF
Taller de Introducción a Scripting con gvSIG
PDF
Presentación appy/pod
PDF
Python_para_todos.pdf
PDF
Python para todos
PDF
Python para todos
PDF
PDF
python-para-todos.pdf
introduccion a phyton, origen e historia del lenguaje de programación
Python-Thonny programación avanzada TESE
Python y la POO, en una clase, UNNe-Corrientes
Introduccion a Python & Temas Basicos.pptx
FUNDAMENTOS PYTHON.ppsx
python CIENTIFIFO.pdf
Manual de python
Python_Module_01_Courtesy.pdf
Acceder a C desde Python (O viceversa)
programacion de sistemas de informacion.ppt
Primeros pasos en pyqt
Python power 1
Transparencias taller Python
Taller de Introducción a Scripting con gvSIG
Presentación appy/pod
Python_para_todos.pdf
Python para todos
Python para todos
python-para-todos.pdf
Publicidad

Último (20)

PDF
Plantilla para Diseño de Narrativas Transmedia.pdf
PDF
programa-de-estudios-2011-guc3ada-para-el-maestro-secundarias-tecnicas-tecnol...
PPTX
Propuesta BKP servidores con Acronis1.pptx
PPT
Que son las redes de computadores y sus partes
PPTX
RAP01 - TECNICO SISTEMAS TELEINFORMATICOS.pptx
PPTX
RAP02 - TECNICO SISTEMAS TELEINFORMATICOS.pptx
PDF
MÓDULO DE CALOR DE GRADO DE MEDIO DE FORMACIÓN PROFESIONAL
PDF
taller de informática - LEY DE OHM
PDF
clase auditoria informatica 2025.........
PPTX
REDES INFORMATICAS REDES INFORMATICAS.pptx
DOCX
Zarate Quispe Alex aldayir aplicaciones de internet .docx
PDF
SAP Transportation Management para LSP, TM140 Col18
PDF
Instrucciones simples, respuestas poderosas. La fórmula del prompt perfecto.
PDF
Calidad desde el Docente y la mejora continua .pdf
PPTX
Presentación de Redes de Datos modelo osi
PPTX
COMO AYUDAN LAS TIC EN LA EDUCACION SUPERIOR.pptx
PDF
MANUAL TECNOLOGÍA SER MINISTERIO EDUCACIÓN
PPT
introduccion a las_web en el 2025_mejoras.ppt
PPTX
Sesion 1 de microsoft power point - Clase 1
PDF
Maste clas de estructura metálica y arquitectura
Plantilla para Diseño de Narrativas Transmedia.pdf
programa-de-estudios-2011-guc3ada-para-el-maestro-secundarias-tecnicas-tecnol...
Propuesta BKP servidores con Acronis1.pptx
Que son las redes de computadores y sus partes
RAP01 - TECNICO SISTEMAS TELEINFORMATICOS.pptx
RAP02 - TECNICO SISTEMAS TELEINFORMATICOS.pptx
MÓDULO DE CALOR DE GRADO DE MEDIO DE FORMACIÓN PROFESIONAL
taller de informática - LEY DE OHM
clase auditoria informatica 2025.........
REDES INFORMATICAS REDES INFORMATICAS.pptx
Zarate Quispe Alex aldayir aplicaciones de internet .docx
SAP Transportation Management para LSP, TM140 Col18
Instrucciones simples, respuestas poderosas. La fórmula del prompt perfecto.
Calidad desde el Docente y la mejora continua .pdf
Presentación de Redes de Datos modelo osi
COMO AYUDAN LAS TIC EN LA EDUCACION SUPERIOR.pptx
MANUAL TECNOLOGÍA SER MINISTERIO EDUCACIÓN
introduccion a las_web en el 2025_mejoras.ppt
Sesion 1 de microsoft power point - Clase 1
Maste clas de estructura metálica y arquitectura

Primeros pasos con Python: Manipulando imágenes ⟷

  • 1. Primeros pasos con Python: Manipulando imágenes Rodolfo Ferro @FerroRodolfo Abril 29, 2017 Universidad de Guanajuato CIMAT A.C.
  • 2. Tabla de contenido 1. Sobre Python 2. Instalación 3. Primeros pasos 4. Manipulando imágenes 5. Creando imágenes 1
  • 4. Python es un lenguaje interpretado, sencillo, versátil y poderoso. La belleza del lenguaje radica en su sintaxis. 1
  • 5. Un poco de historia (I) • Python fue creado a inicios de los 90’s por Guido van Rossum en el Stichting Mathematisch Centrum (CWI), en los Países Bajos, como un sucesor del lenguaje ABC. • Guido sigue siendo el principal autor, aunque incluye muchas contribuciones por parte de otros. 2
  • 6. Un poco de historia (II) • En mayo del 2000, Guido y el equipo core de desarrollo de Python se mudan a BeOpen.com para formar el equipo BeOpen PythonLabs. • En octubre del mismo año, los PythonLabs se mudan a Digital Creations (hoy Zope Corporation) y en 2001 se crea la Python Software Foundation (PSF), una organización sin fines de lucro creada específicamente para poseer todo lo relacionado con propiedad intelectual sobre Python. 3
  • 7. Python en el mundo del SL • Todos los releases de Python son Open Source. • De acuerdo a la Free Software Foundation: 4
  • 8. Recordando un poco... Un Software Libre es aquel que respeta las cuatro libertades que la FSF establece: • La libertad de usar el programa con cualquier propósito. • La libertad de estudiar cómo funciona el programa y modificarlo, adaptándolo a tus necesidades. • La libertad de distribuir copias del programa, con lo cual puedes ayudar a tu prójimo. • La libertad de mejorar el programa y hacer públicas esas mejoras a los demás, de modo que toda la comunidad se beneficie. Nota: El Software Libre no es necesariamente gratuito. 5
  • 10. Instalando Python • Ir al sitio oficial: https://www.python.org/downloads/ • Descargar la versión 3.6.x. 6
  • 11. Instalando Python En Windows: • Preferentemente instalarlo en el disco local C://. • Dar check a la opción ”Add Python to PATH”. En Linux/Unix: • No hace falta algo adicional, todo es hermoso. • Es más, por default ya viene instalada la versión 2.7 de Python. 7
  • 12. Instalando paquetes Al instalar Python, se instala pip (Python Package Index), que es un gestor de paquetes de Python. Usando pip instalaremos: • NumPy, que incluye herramientas de métodos numéricos. • Matplotlib, que incluye herramientas de visualización. Nota: Python se instala con su librería estándar. Lo recomendable es instalar una distribución (como Anaconda) para una mejor gestión de paquetes, además de instalarse por default los más usados. 8
  • 13. Paquetes de manipulación de imágenes Existen diversos paquetes para manipular imágenes: • PIL (Python Imaging Library) • OpenCV (OpenSource Computer Vision) • scikit-image (Scientific Kit - Image) • Etc. Cada uno trata de manera distinta las imágenes y se enfocan en cosas diferentes. Como es un taller de primeros pasos, no usaremos alguno de estos paquetes, sino que trabajaremos desde cero, sólo con numpy y matplotlib. 9
  • 14. Instalando numpy y matplotlib Abriremos una consola y ejecutaremos los siguientes comandos. Para instalar numpy: $ sudo pip install numpy Para instalar matplotlib: $ sudo pip install matplotlib Nota: En Windows se omite el comando sudo. 10
  • 16. El prompt de Python 11
  • 17. Lo básico (I) La belleza de Python radica en la sintaxis, los bloques de código deben tener la misma indentación, pues las llaves { } se utilizan para una estructura de datos (diccionarios). Un ejemplo: while True: # El bloque de código dentro del ciclo debe # estar en el mismo nivel de indentación print("Infinite loop.") 12
  • 18. Lo básico (II) • No hace falta terminar cada línea con punto y coma. • Los scripts de Python pueden ejecutarse desde consola, usando un IDE o con Jupyter notebooks. • Todos los scripts de Python deben ser de extensión .py (excepto por los Jupyter notebooks). • Para fines prácticos, nosotros correremos scripts desde consola y escribiremos código desde un bloc de notas, por lo que es recomendable instalar uno tipo Atom o Sublime Text. 13
  • 19. Variables y operaciones (I) • Las variables no se declaran, sólo se definen y Python sabe el tipo de variable que se está utilizando. • Python cuenta con 5 tipos de datos estándar: números, cadenas de texto, listas, tuplas y diccionarios. • Puedes realizar asignación múltiple. • Las operaciones básicas con números son: +, -, *, /, //, **. • En las cadenas de texto también puede usarse + (concatenación) y * (repetición). 14
  • 20. Variables y operaciones (II) Los tipos de variables que existen en Python son: • Enteros, como 3. • Longs, como 51924361L. • Flotantes, como 3.14e4. • Complejos, como 4.53-7j. • Strings, como ”Hola mundo”. • Listas, como [1., 3, 5.3, ”perrito”]. • Tuplas, como (1., 3, 5.3, ”perrito”). • Diccionarios, como {”Nombre”:”Rodolfo”, ”Apellido”:”Ferro”} 15
  • 21. Condicionales La sintaxis correspondiente es: if/elif/else if condition: # Block content elif condition: # Block content else: # Block content 16
  • 22. Ciclos La sintaxis correspondiente es: for for indx in iterable: # Block content while while condition: # Block content 17
  • 23. Funciones La sintaxis correspondiente es: Funciones def function_name(parameters): # Block content return values No hay limitación en los parámetros y valores de retorno, en el sentido de puede pasársele cualquier variable o función como argumento y cualesquiera variables pueden ser retornadas en una función. 18
  • 24. Para concluir la sección... Para poder concluir la sección y comenzar a tirar nuestras primeras líneas de código en Python, tengamos claro lo siguiente: • ¿Qué es slicing? • ¿Por qué conviene utilizar arreglos de NumPy en vez de listas de Python? • Computacionalmente, ¿qué es una imagen? • ¿Cuántas dimensiones tiene una imagen? • ¿Hay alguna otra pregunta? 19
  • 25. Repositorio del taller: https://github.com/RodolfoFerro/FLISoL17 En este punto, descargar solamente la carpeta de imágenes. 19
  • 27. Objetivos Queremos ser capaces de recrear las siguientes imágenes: 20
  • 28. Para ello... Lo que necesitamos aprender es lo siguiente: 1. Desplegar una imagen 2. Operar una imagen 3. Realizar una transición de opacidad 4. Acceder a pixeles y subsecciones 5. Cortando imágenes 6. Programar derivadas 21
  • 29. Importando NumPy y Matplotlib Se pueden importar librerías simplemente haciendo import librería, sin embargo, se pueden importar módulos específicos (ej. from matplotlib import pyplot) o importar módulos/librerías con un alias. Por simpliacidad nosotros importaremos NumPy y Matplotlib como sigue: Importamos usando un alias: import numpy as np import matplotlib.pyplot as plt 22
  • 30. 1. Desplegando una imagen Matplotlib tiene una función llamada imread, cuyo argumento es una dirección y sirve para leer una imagen y guardarla como un arreglo de NumPy. Podemos imprimir la matriz usando la función print y mostrarla en una ventana haciendo lo que sigue: Después de importar... img = plt.imread("../imgs/Lenna.png") plt.imshow(img) plt.show() Script: show_img.py 23
  • 31. 2. Operando una imagen Dado que las imágenes son matrices, es muy fácil operar imágenes utilizando NumPy. Basta hacer la operación directa en la imagen o utilizar alguna función de NumPy para operar: Después de importar y cargar una imagen inicial... opr = img ** 0.5 opr = np.cos(img) plt.imshow(opr) plt.show() Script: operating_imgs.py 24
  • 32. 3. Transición de opacidad Una transición de opacidad para dos imágenes A y B está definida como sigue: op_img = (1 − α) A + α B, tomando valores de α en el intervalo [0,1]. Por ejemplo el primer estado intermedio: Habiendo cargado una imagen inicial y una final... op_img = 0.7*im_i + 0.3*im_f plt.imshow(op_img) plt.show() Script: opacity.py 25
  • 33. 4. Accediendo a pixeles y subsecciones Dado que las imágenes son matrices, accedemos a un pixel como si accediéramos a un elemento cualquiera de la matriz que representa a la imagen: pixel{i,j} = img[i, j] De la misma manera, utilizando slicing podemos acceder a regiones de la imagen: region{X×Y} = img[yi : yj, xi : xj] 26
  • 34. 5. Cortando una imagen Con lo anterior, es muy fácil cortar y obtener una nueva imagen: region{X×Y} = img[yi : yj, xi : xj], simplemente hace falta guardar el resultado. Habiendo importado librerías... img = plt.imread("Lenna.png") cropped_img = img[220:300, 210:370] plt.imshow(cropped_img) plt.show() img = plt.imsave("Lenna.png", cropped_img) Script: crop_img.py 27
  • 35. 6. Derivando una imagen La derivada de una imagen no es más que un barrido calculando las diferencias entre el pixel en el que te encuentras y el anterior: diffX = img[:, 1 : j] − img[:, 0 : j − 1] diffY = img[1 : i, :] − img[0 : i − 1, :] Con estas derivadas podemos construir una aproximación del gradiente de una imagen: grad ∼ (diff 2 X + diff 2 Y )0.5 Script: derivatives.py 28
  • 36. Reto para llevar Reto 1: Dar formato a la transición de opacidad para que quede como sigue: 29
  • 37. Reto para llevar Reto 2: Nuestras funciones de derivadas de imagen funcionan sólo con imágenes que son cuadradas, ¿por qué? ¿Cómo corregir esto para que sirva con la imagen leaf.png? (HINT: Sobel operator.) 30
  • 38. Para concluir la sección... Para poder concluir la sección y continuar con la siguiente, respondamos: • ¿Resulta sencillo manipular imágenes (arreglos de NumPy, en general)? • ¿Por qué las derivadas de las imágenes ayudan a encontrar bordes? • ¿Hay alguna otra pregunta? 31
  • 40. Objetivos Queremos ser capaces de recrear las siguientes imágenes: 32
  • 41. ¿Por qué un fractal? Como una imagen es una matriz, es muy fácil que seamos capaces de crear una imagen con contenido basura, por lo que resulta ser más interesante construir una imagen a partir de un ente geométrico. Primero necesitamos entender cómo se constrye un fractal, en particular, el Conjunto de Mandelbrot. 33
  • 42. Construyendo el conjunto de Mandelbrot (I) Recordando que un complejo es un número de la forma x + iy y que tiene una representación en el plano; el conjunto de Mandelbrot se construye al iterar un número complejo z en la función fc(z) = z2 + c, para un complejo c. 34
  • 43. Construyendo el conjunto de Mandelbrot (II) Por ejemplo, comenzando en z = 0 + i0 = 0, para el complejo c = 0.25 + i0 = 0.25, tendríamos: f0.25(0) = 02 + 0.25 = 0.25 f0.25(0.25) = 0.252 + 0.25 = 0.625 + 0.25 = 0.65 f0.25(0.65) = 0.652 + 0.25 = 0.4225 + 0.25 = 0.4235 ... = ... De aquí podemos notar que la sucesión no crece arbitrariamente. Sin embargo, ¿qué sucede con otros números, como 1 (1 + i0)? 35
  • 44. Construyendo el conjunto de Mandelbrot (III) • La idea es crear una función que itere un complejo dado hasta un máximo de iteraciones (en caso de no crecer arbitrariamente). • Teniendo dicha función, habrá que usarla dentro de otra para que vaya recorriendo cada complejo en una región y vaya creando el fractal. Nota: El color del pixel en ese punto está asociado con el nivel de iteración, por lo que será necesario tener una condición de paro necesaria en caso de crecer arbitrariamente. Esta condición de paro está relacionada con un acotamiento del conjunto. 36
  • 45. Código (I) Función que itera: def mandel(x, y, max_iters): c = complex(x, y) z = 0j for i in range(max_iters): z = z*z + c if z.real * z.real + z.imag * z.imag >= 4: return 255 * i // max_iters return 255 Script: mandel.py 37
  • 46. Código (II) Función que calcula el fractal... def create_fractal(min_x, max_x, min_y, max_y, image, iters): height = image.shape[0] width = image.shape[1] pixel_size_x = (max_x - min_x) / width pixel_size_y = (max_y - min_y) / height Script: mandel.py 38
  • 47. Código (III) ...continuación: for x in range(width): real = min_x + x * pixel_size_x for y in range(height): imag = min_y + y * pixel_size_y image[y, x] = color return image Script: mandel.py 39
  • 48. Reto para llevar Reto 3: Construir un conjunto de Julia a partir del código mandel.py. (Pueden revisar a @JuliaSetBot en Twitter para ver ejemplos de conjuntos de Julia generados con sus respectivos complejos.) 40
  • 49. Para concluir la sección... Para poder concluir la sección y continuar con la siguiente, respondamos: • ¿Qué sucede si iteramos otra función, en vez de fc(z) = z2 + c? • ¿Cómo se puede mejorar el código para más iteraciones? • ¿Hay alguna otra pregunta? 41
  • 51. Referencias (I) [1] Python Software Foundation. History of the software. History and Licence, disponible en https://docs.python.org/3/license.html, 2017. [2] Hipertextual. ¿Qué es Software Libre? Diferencias entre Software Libre y Open Source, 2014. [3] Hipertextual. ¿Qué es Open Source? Diferencias entre Software Libre y Open Source, 2014. 42
  • 52. Referencias (II) [4] The Hitchhiker’s Guide to Python. Python Imaging Library. Image Manipulation, 2016. [5] The Hitchhiker’s Guide to Python. OpenSource Computer Vision. Image Manipulation, 2016. [6] Python Variable Types. Tutorials Point. Python Basic Tutorial. 43
  • 53. Referencias (III) [7] Image tutorial. Importing image data into Numpy arrays. matplotlib, disponible en http://matplotlib.org/users/image_tutorial.html. [8] Image tutorial. Plotting numpy arrays as images. matplotlib, disponible en http://matplotlib.org/users/image_tutorial.html. 44
  • 54. Referencias (IV) [9] Complex number. Complex number. Wikipedia, the free encyclopedia, disponible en https://en.wikipedia.org/wiki/Complex_number. [10] The Mandelbrot Set. The Mandelbrot Set - Numberphile. Numberphile, disponible en https://www.youtube.com/watch?v=NGMRB4O922I. [11] IBM developerWorks. How To Quickly Compute The Mandelbrot Set In Python. JeanFrancoisPuget, 2015. 45