leer - ¿Ipython notebook(jupyter), opencv(cv2) y ploteado?
python opencv imread (3)
¿Hay alguna forma de usar y trazar con opencv2 con ipython notebook?
Soy bastante nuevo en el análisis de imágenes de Python. Decidí seguir con el flujo de trabajo de la notebook para hacer un buen registro mientras procesaba y ha funcionado bastante bien usando matplotlib / pylab para trazar cosas.
Un obstáculo inicial que tuve fue cómo trazar cosas dentro del cuaderno. Fácil, solo usa la magia:
%matplotlib inline
Más tarde, quise realizar manipulaciones con diagramas interactivos, pero el trazado en una ventana dedicada siempre se congelaría. Bien, aprendí de nuevo que necesitas usar magia. En lugar de simplemente importar los módulos:
%pylab
Ahora he pasado a trabajar con opencv. Ahora vuelvo al mismo problema, donde quiero trazar en línea o usar ventanas dedicadas e interactivas dependiendo de la tarea en cuestión. ¿Hay magia similar para usar? ¿Hay otra manera de hacer que las cosas funcionen? ¿O estoy atascado y necesito volver a ejecutar un programa desde IDLE?
Como nota al margen: sé que opencv se ha instalado correctamente. En primer lugar, porque no tengo errores al instalar o importar el módulo cv2. En segundo lugar, porque puedo leer en imágenes con cv2 y luego trazarlas con otra cosa.
Esta es mi plantilla vacía:
import cv2
import matplotlib.pyplot as plt
import numpy as np
import sys
%matplotlib inline
im = cv2.imread(''IMG_FILENAME'',0)
h,w = im.shape[:2]
print(im.shape)
plt.imshow(im,cmap=''gray'')
plt.show()
Para una notebook Jupyter que se ejecuta en Python 3.5 tuve que modificar esto para:
import io
import cv2
import numpy as np
from IPython.display import clear_output, Image, display
import PIL.Image
def showarray(a, fmt=''jpeg''):
a = np.uint8(np.clip(a, 0, 255))
f = io.BytesIO()
PIL.Image.fromarray(a).save(f, fmt)
display(Image(data=f.getvalue()))
También existe esa pequeña función que se usó en Google Deepdream Notebook:
import cv2
import numpy as np
from IPython.display import clear_output, Image, display
from cStringIO import StringIO
import PIL.Image
def showarray(a, fmt=''jpeg''):
a = np.uint8(np.clip(a, 0, 255))
f = StringIO()
PIL.Image.fromarray(a).save(f, fmt)
display(Image(data=f.getvalue()))
Entonces puedes hacer:
img = cv2.imread("an_image.jpg")
Y simplemente:
showarray(img)
Cada vez que necesites renderizar la imagen en una celda.