Digamos que tengo una imagen de tamaño 3841 x 7195 píxeles. Me gustaría guardar el contenido de la figura en el disco, lo que da como resultado una imagen del tamaño exacto que especifico en píxeles.
Sin eje, sin títulos. Solo la imagen. Personalmente, no me importan los DPI, ya que solo quiero especificar el tamaño que toma la imagen en la pantalla en el disco en píxeles .
He leído otros hilos , y todos parecen hacer conversiones a pulgadas y luego especifican las dimensiones de la figura en pulgadas y ajustan los ppp de alguna manera. Me gustaría evitar lidiar con la posible pérdida de precisión que podría resultar de las conversiones de píxeles a pulgadas.
He intentado con:
w = 7195
h = 3841
fig = plt.figure(frameon=False)
fig.set_size_inches(w,h)
ax = plt.Axes(fig, [0., 0., 1., 1.])
ax.set_axis_off()
fig.add_axes(ax)
ax.imshow(im_np, aspect='normal')
fig.savefig(some_path, dpi=1)
sin suerte (Python se queja de que el ancho y la altura deben estar por debajo de 32768 (?))
Por todo lo que he visto, matplotlib
requiere que se especifique el tamaño de la figura inches
y dpi
, pero solo me interesan los píxeles que la figura toma en el disco. ¿Cómo puedo hacer esto?
Para aclarar: estoy buscando una manera de hacer esto matplotlib
, y no con otras bibliotecas para guardar imágenes.
fuente
Respuestas:
Matplotlib no funciona con píxeles directamente, sino con tamaños físicos y DPI. Si desea mostrar una figura con un cierto tamaño de píxel, debe conocer el DPI de su monitor. Por ejemplo, este enlace lo detectará por usted.
Si tiene una imagen de 3841x7195 píxeles, es poco probable que su monitor sea tan grande, por lo que no podrá mostrar una figura de ese tamaño (matplotlib requiere que la figura quepa en la pantalla, si solicita un tamaño demasiado grande se reducirá al tamaño de la pantalla). Imaginemos que desea una imagen de 800x800 píxeles solo como ejemplo. Aquí le mostramos cómo mostrar una imagen de 800x800 píxeles en mi monitor (
my_dpi=96
):Básicamente, simplemente divide las dimensiones en pulgadas por su DPI.
Si desea guardar una figura de un tamaño específico, entonces es un asunto diferente. Los DPI de pantalla ya no son tan importantes (a menos que solicite una figura que no cabe en la pantalla). Usando el mismo ejemplo de la figura de 800x800 píxeles, podemos guardarlo en diferentes resoluciones usando la
dpi
palabra clave desavefig
. Para guardarlo en la misma resolución que la pantalla, solo use el mismo dpi:Para guardarlo como una imagen de 8000x8000 píxeles, use un dpi 10 veces más grande:
Tenga en cuenta que la configuración del DPI no es compatible con todos los backends. Aquí, se utiliza el backend PNG, pero los backends pdf y ps implementarán el tamaño de manera diferente. Además, cambiar el DPI y los tamaños también afectarán cosas como el tamaño de fuente. Un DPI más grande mantendrá los mismos tamaños relativos de fuentes y elementos, pero si desea fuentes más pequeñas para una figura más grande, debe aumentar el tamaño físico en lugar del DPI.
Volviendo a su ejemplo, si desea guardar una imagen con 3841 x 7195 píxeles, puede hacer lo siguiente:
Tenga en cuenta que utilicé la cifra de ppp de 100 para caber en la mayoría de las pantallas, pero la guardé
dpi=1000
para lograr la resolución requerida. En mi sistema, esto produce un png con 3840x7190 píxeles; parece que el DPI guardado siempre es 0,02 píxeles / pulgada más pequeño que el valor seleccionado, lo que tendrá un efecto (pequeño) en los tamaños de imagen grandes. Un poco más de discusión sobre esto aquí .fuente
figsize
aplt.figure
. La solución fue hacer que las otras respuestas sugieren que y después de llamar sinfigsize
, a continuación, llamarfig.set_size_inches(w,h)
figure
ysavefig
.Esto funcionó para mí, basado en su código, generando una imagen png de 93Mb con ruido de color y las dimensiones deseadas:
Estoy usando las últimas versiones PIP de las bibliotecas Python 2.7 en Linux Mint 13.
¡Espero que ayude!
fuente
Según la respuesta aceptada por tiago, aquí hay una pequeña función genérica que exporta una matriz numpy a una imagen que tiene la misma resolución que la matriz:
Como se dijo en la respuesta anterior de tiago, la pantalla DPI debe encontrarse primero, lo que se puede hacer aquí, por ejemplo: http://dpi.lv
Agregué un argumento adicional
resize_fact
en la función que permite exportar la imagen al 50% (0.5) de la resolución original, por ejemplo.fuente
plt.imsave funcionó para mí. Puede encontrar la documentación aquí: https://matplotlib.org/3.2.1/api/_as_gen/matplotlib.pyplot.imsave.html
fuente