¿Cómo leer, visualizar y guardar una imagen en Python usando OpenCV?
CONTENIDO
- Leer una imagen
- Visualizar una imagen
- Guardar/Almacenar una imagen
El primer paso para realizar aplicaciones de visión por computador es sin duda tener el «material» o en este caso la imagen con la cual trabajar, es por ello que el segundo post que te presento (luego de la bienvenida) es: ¿cómo leer la imagen usando OpenCV en Python?.
En un principio será necesario importar la librería OpenCV, para ello usamos la siguiente línea:
import cv2
NOTA: Si aún no has instalado OpenCV en python, ya sea en tu computador o en tu raspberry, te recomiendo que lo instales con los tutoriales de pyimagesearch. Lo sé, sus posts están desarrollados en inglés, sin embargo son los mejores. Demás está decir que están excelentemente explicados, paso a paso.
En esta ocasión vamos a trabajar con esta imagen:
LEER UNA IMAGEN EN PYTHON – OPENCV
Ahora procedemos a leer la imagen, para ello necesitamos la función cv2.imread
, en ella tendremos que especificar el path o dirección en donde se encuentra almacenado la imagen. Si tanto el script donde estás desarrollando estas líneas y la imagen están en una misma dirección, solo será necesario escribir el nombre, seguido de su extensión.
imagen = cv2.imread('logo.png')
¡A tener en cuenta!
Al momento que leemos una imagen, tal y como lo hemos hecho en la línea 2, ésta por defecto es leída en BGR, así también podríamos escribirlo de la siguiente manera: imagen = cv2.imread('logo.png',1)
El número 1 indica también que será leída en BGR, así que podríamos omitirlo como he mostrado previamente.
En OpenCV existen algunos otros números o comandos con los cuales condicionamos como queremos que se lea una imagen, por ejemplo si usamos 0: imagen = cv2.imread('logo.png',0)
.La imagen será leída en escala de grises. Puedes buscar más información de otras opciones que podrías utilizar en la documentación de OpenCV.
VISUALIZAR UNA IMAGEN
Hasta este punto ya hemos leído la imagen, pero debemos visualizarla, para ello usaremos cv2.imshow
, en ella debemos especificar el nombre de la ventana que se va a visualizar, seguido de la variable donde está almacenada la imagen.
Se visualiza cierto tiempo para ello se emplea cv2.waitKey
. Esta permite especificar el tiempo en milisegundos, por ejemplo: cv2.waitKey(1000)
, hará que la imagen se vea durante 1 segundo. Hay una opción muy utilizada, y es que al usar cv2.waitKey(0)
, la imagen se visualiza infinitamente, hasta que presiones cualquier tecla.
Finalmente para cerrar la visualización creada usamos
cv2.destroyAllWindows
. Veamos:
cv2.imshow('Logo OpenCV',imagen) cv2.waitKey(0) cv2.destroyAllWindows()
GUARDAR O ALMACENAR UNA IMAGEN
Para almacenar una imagen, lo único que se necesita es usar cv2.imwrite
, en donde tendremos que especificar el nombre de la imagen a almacenar junto con la extensión, luego la variable a la que está asignada dicha imagen. Como podrás darte cuenta, esta función trabaja similar a cv2.imshow
.
Para este ejemplo, vamos a leer la imagen en escala de grises y la guardaremos, esta se almacenará en la misma dirección donde se encuentra el script donde estás desarrollando este programa.
import cv2 imagen = cv2.imread('logo.png',0) cv2.imwrite('Grises.png',imagen) cv2.imshow('Logo OpenCV Grises',imagen) cv2.waitKey(0) cv2.destroyAllWindows()
La figura 3 muestra la imagen que se guardó gracias a cv2.imwrite
.
Y aquí llegamos al final de este post. Puedes ver el video también. ¿Qué te ha parecido?.
Resumen del contenido de este post
REFERENCIAS
[1] https://docs.opencv.org/3.0-beta/doc/py_tutorials/py_gui/py_image_display/py_image_display.html
Hola Gabriela, primero felicitarte por tu aporte, yo estoy tratando de aprender un poco y he podido hacer una comparación de fotos para saber si una persona esta en una foto ya sea que este solo o acompañado, fue muy divertido hacerlo, mi consulta es si sabes de alguna librería con la que puedo hacer lo mismo, pero ahora con las personas usando mascarillas, yo use face_recognition, agradecería cualquier ayuda.
Muchas gracias
Hola Jorge, muchas gracias. Creo que este post te puede servir: https://www.pyimagesearch.com/2020/05/04/covid-19-face-mask-detector-with-opencv-keras-tensorflow-and-deep-learning/
Hola Grabriela, gracias por tu aporte, apenas estoy emezando con el tema de visión y creo que esta ha sido el blog más claro que he encontrado, en inglés y en español. ¿Sabes de algún comando que me permite borrar una imagen (en caso de haberla guardado previamente con cv2.imwrite?
Hola Estefania muchas gracias :), puedes usar os para borrar archivos con python.
Hola Gabriela, al igual que los demás, quiero agradecerte tu curso. He comprado tres libros, revisado varios tutoriales, preguntado a varios compañeros y no podía instalar y usar opencv. Gracias a tus videos terminan meses de sufrimiento. Si requieres un donativo, abre tu cuenta en paypal y con gusto haré un donativo pequeño. Agradezco tus videos, espero que continues y te deseo que pronto te conviertas a YouTuber con muchos seguidores.
Hola Abel, me alegra muchísimo que los posts/videos te hayan servido, muchas gracias por dejármelo saber, me llena de mucho ánimo :D. Te cuento que no poseo una cuenta en paypal, pero te agradezco un montón el hecho que quieras aportar con el contenido. Muchas gracias por tus deseos, espero poder seguir realizando este tipo de contenido, espero pronto poder sacar un curso.
Gracias Gaby, la labor qué haces de compartir tus conocimientos es algo muy loable y respecto al material está muy bien explicado, bendiciones.
Ohh! Muchas gracias Wuasmo T. me alegra mucho que te haya gustado el contenido. 🙂
Hola Gaby como estas, quería preguntarte ya que vi uno de tus videos para leer, visualizar y guardar una imagen en python usando Open CV que utilice el mismo metodo que usaste en el video y me manda un error(apenas estoy adentrandome en esto de la programación).
Hola José, qué error te da?
hola guapa Gaby… gracias por tus aportes me ayudan bastante. Saludos desde Loja-Ecuador
¡Muchas gracias Jose!. Que alegría que seas de mi Loja querida un abrazo. 🙂
ADORO TU BLOG 😀 Voy a ver todos tus videos eres muy buena explicando muchas gracias por tus aportes
Hola Carlos. De verdad? Muchas gracias Carlos, me alegra muchísimo que te guste el contenido que realizo, de verdad muchas gracias.:)
hola gabriela , necesito saber si puedo guardar las imagenes de rsultado
es decir, yo escribo un codico y pues ya lo corro y me da un resultado verdad
quiero decirle con codigo que ese resltado me lo guarde
por ejemplo: yo tengo este codigo, y me da un resultado de una caja con varia lineas , eso lo quiero guardar
import cv2
import numpy as np
print(«se importo»)
imagen = 255*np.ones((400,600,3),dtype=np.uint8)
print(«ya se hizo»)
caja = 255*np.ones((600,600,4),dtype=np.uint8)
print(«esta tamb se hizo»)
#Dibujando lineas
cv2.line(imagen,(0,0),(600,400),(255,0,0),4)
cv2.line(imagen,(300,0),(300,200),(255,100,255),10)
cv2.line(caja,(0,100),(100,0),(255,0,255),10)
cv2.line(caja,(0,200),(200,0),(0,255,0),30)
cv2.line(caja,(0,300),(300,0),(0,0,255),10)
cv2.line(caja,(0,400),(400,0),(250,255,220),30)
cv2.line(caja,(0,500),(500,0),(255,0,0),10)
cv2.line(caja,(0,600),(600,0),(25,0,200),30)
cv2.line(caja,(600,600),(200,200),(200,200,200),10)
cv2.line(caja,(200,0),(0,200),(0,255,0),30)
cv2.line(caja,(300,0),(0,300),(0,0,255),10)
cv2.line(caja,(400,0),(0,400),(250,255,220),30)
cv2.imshow(«la caja»,caja)
cv2.imwrite(«Resources/MASLINEAS.png»,caja)****y segun yo aqui lo guardo en una imagen pero solo se guarda la caja blanca sin las lineas de colores, que como resultado me da mi codigo
cv2.waitKey(0)
cv2.destroyAllWindows()
Buena web… Muchas gracias, Un saludo
Muchas gracias! 😀
Hola Gaby, gracias por tener un blog tan útil como este, tengo una duda quiero cambiarle las dimensiones a muchas imágenes, que código puedo usar para no cambiarla una por una sino todas a la vez?
Hola Camila, muchas gracias, eres muy amamble. Podrías almacenarlas todas en un directorio y luego leer y redimensionar cada una de ellas desde el código, algo como lo que se hizo aquí: https://www.youtube.com/watch?v=ZYPyM4JUU7w
Muy bueno.
Solo que me pasó un error:
File «D:\Documentos\UPN\2021\SistemasInteligentes\Pruebas_omes\leerimagen_01.py», line 6, in
cv2.imshow(‘Prueba de Imagen’, imagen)
cv2.error: OpenCV(4.5.1) C:\Users\appveyor\AppData\Local\Temp\1\pip-req-build-5rb_9df3\opencv\modules\highgui\src\window.cpp:376: error: (-215:Assertion failed) size.width>0 && size.height>0 in function ‘cv::imshow’
Buscando la solucion era que el nombre usado de la imagen no correspondía (por una letra). Al corregir el nombre todo quedó OK. Tal vez le pueda servir a alguien cuando tenga ese error.
Saludos!
Muchas gracias Miguel! 🙂
Hola, excelente contenido. Muy educativo y practico. Tengo una duda, si tengo una imagen en la cual estoy imprimiendo rectangulos sobre circulos que estoy detectando, como puedo mantener esos rectangulos en la imagen, sin que al usar imshow se borre los que ya tenia. O como puedo guardar la imagen con los rectangulos para continuar imprimiendo rectangulos encima
Hola Nicolas, muchas gracias!. 🙂 Podrías usar cv2.imshow y especificar diferentes nombres según la imagen que desees visualizar. Al especificar diferentes nombres, incluso podrías visualizar la misma imagen varias veces.
Hola muchas gracias por tus videos y tutoriales, llevo menos de un año aprendiendo a programar y tengo muchísimas dudas pero tus tutoriales me han ayudado. De momento me gustaría saber si puedes orientarme en cómo guardar una foto sin sobre escribir las que se van guardando.
mientras no cierre mi programa las imágenes se van guardando bien con un valor ascendente, sin embargo si lo cierro y vuelvo a abrir, comienza desde 1 sobre escribiendo las fotos anteriores.
Hola Luis, podrías leer con os.listdir(path), las imágenes de dicho path, y con ello puedes saber el número con el que continuarías guardando. Otra cosa que puedes hacer es guardar la imagen con fecha y hora como nombre, de ese modo no se repetirán.
Excelente, es el mejor blog de open_cv, sigue asì.
Muchas gracias Oscar. 🙂
Hola buen día.
Gracias por la explicación esta mu detallada y fácil de entender.
Me gustaría que me ayudaras con algo parecido que es guardar la imagen después de haberle aplicado el «filtro» por decirlo así, ya que necesito es guardar el resultado final.
Gracias por su colaboración y espero una pronta respuesta.
img = cv2.imread(‘D:\\ARDISA\\Desktop\\modelos de rpa\\pdf\\entregas\\10562719.png’,0)
img2 = np.power(img/float(np.max(img)), 1/4)
cv2.imshow(‘gamma=1.5’,img2)
nueva_img=cv2.waitKey(0)
cv2.imwrite(«lenaGuardada.png»,nueva_img)
Hola Fabian, tendrías que almacenar la imagen como tal. cv2.waitKey(0) nos sirve para que se visualice una imagen por tiempo indefinido hasta que una tecla sea presionada.
Hola Gabriela.
Nose porqué no consigo leer las imágenes, poniendo el mismo código que tu, aquí te dejo el código
import cv2
imagen = cv2.imread(‘screenshot.png’)
cv2.imshow(‘screenshot.png’,imagen)
cv2.waitKey(0)
cv2.destroyAllWindows()
y cuando le doy a ejecutar me sale este error
[ WARN:[email protected]] global D:\a\opencv-python\opencv-python\opencv\modules\imgcodecs\src\loadsave.cpp (239) cv::findDecoder imread_(‘screenshot.png’): can’t open/read file: check file path/integrity
Traceback (most recent call last):
File «c:\Users\Josep\Desktop\python\prova.py», line 4, in
cv2.imshow(‘screenshot.png OpenCV’,imagen)
cv2.error: OpenCV(4.6.0) D:\a\opencv-python\opencv-python\opencv\modules\highgui\src\window.cpp:967: error: (-215:Assertion failed) size.width>0 && size.height>0 in function ‘cv::imshow’
sabes a que es debido este error ?
Hola Gabriela, excelente blog para quienes estamos comenzando en AI con Python.
Cuando quiero recrear el tutorial en VSC con la versión 4.9.0 de OpenCV tengo el siguiente error: Import «cv2» could not be resolvedPylancereportMissingImports)
Buscando soluciones me solicitan instalar opencv y reiniciar el IDE. Pero no lo soluciona.
¿Tal vez tengas otra opción de solución para el error?