Notebook created by Martín Villanueva - martin.villanueva@usm.cl
- DI UTFSM - June 2017.
In [3]:
import numba
import numpy as np
import matplotlib.pyplot as plt
import threading
import multiprocessing
from ipyparallel import Client
def image_plot(img):
"""
img is an (nx,ny,3) numpy.array
"""
plt.figure(figsize=(12,12))
plt.imshow(img)
plt.axis('off')
plt.show()
En esta actividad realizaremos convolución de imágenes (tarea altamente paralelizable), sobre imágenes de gran tamaño y de forma paralela, utilizando bibliotecas de paralelización en Python.
En primer lugar cargamos y visualizamos la imágen a trabajar:
In [4]:
img = plt.imread('heic1608b.jpg', format='jpeg')[0:8660,:,:]
print(img.shape)
In [5]:
image_plot(img)
Lo que se desea es aplicar un filtro de blurring (Gaussiano) sobre tal imágen. En este caso ocuparemos en filtro/kernel Gaussiano de 5x5
generado por la siguiente función:
In [26]:
def gaussian_kernel(shape=(3,3),sigma=0.5):
"""
2D gaussian mask - should give the same result as MATLAB's
fspecial('gaussian',[shape],[sigma])
"""
m,n = [(ss-1.)/2. for ss in shape]
y,x = np.ogrid[-m:m+1,-n:n+1]
h = np.exp( -(x*x + y*y) / (2.*sigma*sigma) )
h[ h < np.finfo(h.dtype).eps*h.max() ] = 0
sumh = h.sum()
if sumh != 0:
h /= sumh
return h
In [27]:
K = gaussian_kernel((5,5))
print(K)
Para ello se le solicita lo siguiente:
IPython.Parallel
desarrolle una solución para aplicar el filtro de convolución K
sobre la imágen dada. Usted es libre de elegir el modo (synchronous o asynchronous) y el modo de despacho de tareas. Notar: Que la imágen tiene 3 canales (RGB) y debe aplicar el filtro independientemente en cada uno.1
, 2
, 4
y 8
engines realizando un análisis de tiempo con %timeit
. Extraiga conclusiones de los resultados obtenidos (considere las características del CPU de su computador).
In [ ]: