Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

933
Views
imdecode devuelve Ninguno Python opencv2

Mira este código,

 img = cv2.imread("image2.jpg",0) img_str = cv2.imencode('.jpg', img)[1] #Encodes and stores in buffer print(img_str) #for i,item in enumerate(img_str): } THIS # img_str[i] = 255-item } IS CONFUSING nparr = np.frombuffer(img_str, np.uint8) img2 = cv2.imdecode(nparr, cv2.IMREAD_COLOR)

Mi pregunta es sin esto,

 #for i,item in enumerate(img_str): } THIS # img_str[i] = 255-item } IS CONFUSING

¡El código funciona bien imdecode devuelve lo mismo! Pero, sin embargo, cuando elimino el comentario, imdecode devuelve Ninguno .

Los documentos de Opencv dicen

Si el búfer es demasiado corto o contiene datos no válidos, se devuelve la matriz/imagen vacía.

¿Cuáles son exactamente los datos no válidos que hacen que imdecode no devuelva ninguno? ¿O algún otro error?

over 4 years ago · Santiago Trujillo
1 answers
Answer question

0

Entendí mal tu pregunta antes, pero ahora tus comentarios lo hacen más claro.

Cuando codifica una imagen en '.jpg' , no es una matriz de píxeles como antes, sino una matriz de bytes que representa una imagen jpeg. Será el equivalente a leer los bytes de la imagen directamente con funciones nativas.

Si transforma cada byte, no podrá decodificarlo correctamente y sus datos no serán válidos.

Examinemos los datos un poco más detenidamente:

Primero, cargamos la imagen y codificamos los datos.

 # Exactly what you have to load and encode import cv2 import numpy as np img = cv2.imread("image2.jpg",0) img_str = cv2.imencode('.jpg', img)[1]

Ahora, aplanemos la matriz de imágenes y veamos los primeros 10 píxeles (uso una imagen aleatoria que tenía en mi disco):

 img.flatten()[0:10]

Esto me da:

 [191, 191, 191, 191, 191, 191, 191, 191, 191, 191]

Ahora, mostremos los primeros 10 bytes del codificado:

 print(img_str.flatten()[0:10])

Y obtengo:

 [255 216 255 224 0 16 74 70 73 70]

Como pueden ver, son números totalmente diferentes a los anteriores.... y no solo eso, al menos los 2 primeros bytes dan información sobre la imagen como se explica en el enlace que puse un poco antes.

El inicio de la imagen es el siguiente código:

 0xFF, 0xD8

Que si lo pones en números decimales te dará:

 255 216

Cuáles son los primeros 2 bytes de la matriz de bytes... Si resta 255-byte para todos los bytes, entonces la parte inicial será 0 39 , que será una sintaxis no válida para que el decodificador la analice.

En conclusión, no cambie los bytes de la imagen después de codificarla, cámbielos antes de codificarla si es necesario, e intente usar también la función de OpenCV o de numpy para hacerlo más rápido, el ciclo lleva bastante tiempo en python. Para invertir la imagen y luego codificarla es el siguiente código:

 import cv2 import numpy as np img = cv2.imread("image2.jpg",0) invImg = cv2.bitwise_not(img) # equivalent to 255-img img_str = cv2.imencode('.jpg', invImg )[1] img2 = cv2.imdecode(nparr, cv2.IMREAD_COLOR)

Otra cosa a considerar, si tiene una imagen y la codifica y decodifica en jpg, NO SERÁ LA MISMA IMAGEN , porque jpg es una compresión con pérdida y tendrá algunas pequeñas diferencias.

over 4 years ago · Santiago Trujillo Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!