Bienvenue sur IndexError.

Ici vous pouvez poser des questions sur Python et le Framework Django.

Mais aussi sur les technos front comme React, Angular, Typescript et Javascript en général.

Consultez la FAQ pour améliorer vos chances d'avoir des réponses à vos questions.

forcer la taille des pixels dans matplotlib.pyplot

+4 votes

Je bosse sur des images médicales venant de sources différentes, avec des résolutions différentes; je ne parle pas de dpi mais bien de la taille des voxels (équivalent pixels en 3D). Par exemple je vais me retrouver avec une image dont les pixels feront 0.92x1.1x1.2 mm.
Je dois faire des "planches contact" de mes images. Pour chaque image médicale j'extraie une "tranche" pour l'afficher. J'utilise donc une techno simple et connue : matplotlib.pyplot. Problème: je me retrouve avec des images déformées dans des proportions variables et ce quel que soit le mode d'affichage utilisé:
- extent, qui force l'image à remplir une zone de dimensions données. Comme les images sont différentes, celles dont les dimensions originales sont proches de celle de la zone ne vont quasiment pas être affectées, celles qui sont très différentes ne vont ressembler à rien.
- aspect, qui va agir comme un zoom à base de ratio. Le Ratio étant différent pour chaque image, c'est mort.

J'en suis arrivé à prendre le problème à l'envers: puisque mes voxels sont anisotropes je rééchantillonne les données 3D pour que lesdits voxels aients comme dimensions 1.0x1.0x1.0. Sauf que c'est overkill, et lent.
Je peux travailler sur les images 2D, mais ça ne va pas beaucoup plus vite (et le résultat est moins bon).

Je cherche donc à savoir s'il est possible de forcer la taille des pixels lors de l'affichage d'une image avec matplotlib.pyplot, quitte à faire une conversion. Pour le moment je n'ai pas trouvé.

demandé 3-Jun-2015 par furankun (1,434 points)

Juste pour être bien sûr de comprendre : ton problème c'est d'afficher "dans le même cadre" plusieurs images, chacune ayant sa propre taille de pixel même pas carré ?

Et aussi, quand tu dis matplotlib.pyplot, il s'agit de la fonction imshow() ou d'une autre ?

Je lance un truc au pif : NonUniformImage (je connais pas).
Avec un exemple trouver dans la galerie.

Je savais que ce n'était pas très clair comme question. En fait je fais un subplot avec une gridspec (je ne pense pas que ça ait besoin d'être développé) et j'affiche mes images sur 4 lignes et 4 colonnes (donc 16 images par planche). Chaque image a donc son "cadre", mais chaque cadre est de dimensions identiques.
Et oui, il s'agit d'un imshow().

Je vais regarder tes liens, merci beaucoup!

Bon j'ai regardé NonUniformImage et l'ai testé, honnêtement à part les ticks des axes qui changent je ne vois pas la différence avec une image normale; en tout cas ça ne colle pas avec mon problème. J'ai bricolé un truc intermédiaire avec la méthode précédente, c'est plus rapide et un peu crade mais fonctionnel... donc ça fera l'affaire.
Si jamais je tombe sur une solution je viendrai la poster.

Il n'y a pas la possibilité d'utiliser aspect en calculant le ratio correspondant a l'image ?

Il n'y a pas la possibilité d'utiliser aspect en calculant le ratio correspondant a l'image ?

Comme dit au départ:
"- aspect, qui va agir comme un zoom à base de ratio. Le Ratio étant différent pour chaque image, c'est mort."

Peut-tu mettre le code que tu utilises pour plotter ? On dirait que tu ne définis pas les indexes sur tes axes.

J'ai changé de boîte depuis, je n'ai plus le code.

Ah, il faudrait peut-être fermer la question alors. Je ne sais pas si c'est possible...

@Kontre non c'est une mauvaise idée de fermer la question, quelqu'un pourrait avoir des questions similaires et ca pourrait lui donner des pistes

Votre réponse

Preview

Votre nom à afficher ( en option ):
Vie privée: . Votre adresse de messagerie ne sera utilisée que pour l'envoi de ces notifications .
Vérification anti -spam:
Pour éviter cette vérification à l'avenir, Connectez vous ou inscrivez vous.
...