{"id":8179,"date":"2026-10-14T18:02:21","date_gmt":"2026-10-14T18:02:21","guid":{"rendered":"http:\/\/french.arabpsychology.com\/statistics\/afficher-image-niveaux-de-gris-matplotlib-exemple\/"},"modified":"2026-10-14T18:02:21","modified_gmt":"2026-10-14T18:02:21","slug":"afficher-image-niveaux-de-gris-matplotlib-exemple","status":"publish","type":"psych_stat","link":"https:\/\/french.arabpsychology.com\/?psych_stat=afficher-image-niveaux-de-gris-matplotlib-exemple","title":{"rendered":"Afficher une image en niveaux de gris dans Matplotlib (avec exemple)"},"content":{"rendered":"<p>Dans le domaine du traitement num\u00e9rique du signal visuel et de la science des donn\u00e9es exp\u00e9rimentales, la manipulation et la restitution graphique des matrices d&rsquo;intensit\u00e9 lumineuse constituent un jalon m\u00e9thodologique fondamental. Alors que l&rsquo;imagerie contemporaine privil\u00e9gie l&rsquo;encodage trichromatique pour se conformer aux r\u00e9cepteurs r\u00e9tiniens de l&rsquo;observateur humain, de multiples champs scientifiques \u2014 allant de la vision par ordinateur \u00e0 la psychophysique de la perception \u2014 n\u00e9cessitent une r\u00e9trogradation contr\u00f4l\u00e9e vers des repr\u00e9sentations scalaires monochromes. Dans ce contexte, l&rsquo;\u00e9cosyst\u00e8me scientifique du langage Python s&rsquo;impose comme une r\u00e9f\u00e9rence incontournable, articulant les capacit\u00e9s de manipulation de tableaux multidimensionnels de NumPy, la flexibilit\u00e9 de traitement d&rsquo;images de Pillow et la puissance de restitution cartographique de la biblioth\u00e8que <a rel=\"noopener noreferrer\" href=\"https:\/\/matplotlib.org\/\">Matplotlib<\/a>.<\/p>\n<p>Cependant, la transition d&rsquo;un tenseur couleur tridimensionnel vers une projection visuelle fid\u00e8le en niveaux de gris rec\u00e8le des subtilit\u00e9s algorithmiques et th\u00e9oriques fr\u00e9quemment sous-estim\u00e9es. Loin de se r\u00e9sumer \u00e0 une simple op\u00e9ration cosm\u00e9tique, l&rsquo;affichage d&rsquo;une image en nuances de gris met en jeu des notions complexes de photom\u00e9trie physiologique, de compression dimensionnelle de structures matricielles et de s\u00e9lection rigoureuse de tables de correspondance colorim\u00e9trique (<a rel=\"noopener noreferrer\" href=\"https:\/\/matplotlib.org\/stable\/users\/explain\/colors\/colormaps.html\">colormaps<\/a>). Une mauvaise compr\u00e9hension des m\u00e9canismes internes du moteur de rast\u00e9risation de Matplotlib conduit in\u00e9vitablement \u00e0 des artefacts visuels pr\u00e9judiciables, tels que la colorisation involontaire en fausses couleurs ou l&rsquo;\u00e9crasement de contrastes spatiaux d\u00e9terminants pour l&rsquo;analyse computationnelle.<\/p>\n<p>Le pr\u00e9sent article propose une exploration exhaustive, rigoureuse et didactique de la cha\u00eene de traitement permettant d&rsquo;afficher une image en niveaux de gris avec Matplotlib. En croisant les exigences du g\u00e9nie logiciel avec les imp\u00e9ratifs m\u00e9thodologiques de la recherche en vision computationnelle et en neurosciences cognitives, nous d\u00e9taillerons chaque \u00e9tape du processus : depuis l&rsquo;acquisition des donn\u00e9es brutes en m\u00e9moire jusqu&rsquo;aux subtilit\u00e9s d&rsquo;exportation pour des publications acad\u00e9miques \u00e0 haute r\u00e9solution, en passant par l&rsquo;analyse critique des formules de conversion de luminance et le calibrage de la dynamique de contraste.<\/p>\n<h2>1. Introduction aux repr\u00e9sentations en niveaux de gris et visualisation de donn\u00e9es<\/h2>\n<h3>1.1 Fondements th\u00e9oriques de l&rsquo;\u00e9chelle de gris en imagerie num\u00e9rique<\/h3>\n<p>L&rsquo;imagerie num\u00e9rique en niveaux de gris repose sur le concept de luminance monochromatique, d\u00e9fini comme la mesure scalaire de l&rsquo;intensit\u00e9 \u00e9nerg\u00e9tique \u00e9mise, transmise ou r\u00e9fl\u00e9chie par un \u00e9l\u00e9ment de surface spatialement d\u00e9limit\u00e9, couramment nomm\u00e9 pixel. Contrairement aux espaces chromatiques trichromes \u2014 tels que le mod\u00e8le rouge, vert, bleu (<a rel=\"noopener noreferrer\" href=\"https:\/\/www.w3.org\/Graphics\/Color\/sRGB\">sRGB<\/a>) standardis\u00e9 par la Commission \u00c9lectrotechnique Internationale \u2014 qui n\u00e9cessitent l&rsquo;assignation de trois coordonn\u00e9es ind\u00e9pendantes par point \u00e9chantillonn\u00e9, l&rsquo;\u00e9chelle de gris projette l&rsquo;information visuelle sur une dimension unique. Cette projection implique une cartographie continue ou discr\u00e9tis\u00e9e de l&rsquo;intensit\u00e9 lumineuse comprise entre une absence th\u00e9orique de signal, caract\u00e9risant le noir absolu, et une saturation radiative maximale, correspondant au blanc spectral.<\/p>\n<p>D&rsquo;un point de vue analytique et algorithmique, la r\u00e9duction de la dimensionnalit\u00e9 chromatique offre un avantage computationnel consid\u00e9rable. En faisant transiter un tenseur tridimensionnel de dimensions hauteur, largeur et canaux spectraux vers une matrice bidimensionnelle d&rsquo;intensit\u00e9 pure, les exigences en termes de m\u00e9moire vive et de temps de calcul sont divis\u00e9es par un facteur substantiel. Cette simplification permet d&rsquo;appliquer directement des op\u00e9rateurs d&rsquo;alg\u00e8bre lin\u00e9aire, des filtres de convolution spatiale pour la d\u00e9tection de contours (comme les op\u00e9rateurs de Sobel, Prewitt ou de Canny) ou encore des transformations fr\u00e9quentielles de Fourier, sans se heurter aux ambigu\u00eft\u00e9s inh\u00e9rentes \u00e0 l&rsquo;interaction diff\u00e9rentielle des canaux spectraux.<\/p>\n<p>Il est toutefois imp\u00e9ratif d&rsquo;op\u00e9rer une diff\u00e9renciation \u00e9pist\u00e9mologique stricte entre l&rsquo;intensit\u00e9 physique mesurable d&rsquo;un front d&rsquo;onde \u00e9lectromagn\u00e9tique et le codage num\u00e9rique scalaire allou\u00e9 \u00e0 chaque pixel. Dans le monde physique, la luminance correspond \u00e0 une grandeur photom\u00e9trique exprim\u00e9e en candelas par m\u00e8tre carr\u00e9 (cd\/m\u00b2), pond\u00e9r\u00e9e par la fonction d&rsquo;efficacit\u00e9 lumineuse spectrale de l&rsquo;\u0153il humain. En revanche, au sein d&rsquo;une matrice num\u00e9rique, cette valeur est discr\u00e9tis\u00e9e, le plus souvent sur 8 bits (prenant ainsi des valeurs enti\u00e8res positives comprises entre 0 et 255) ou sous forme de valeurs flottantes normalis\u00e9es sur l&rsquo;intervalle unitaire r\u00e9el. Cette abstraction num\u00e9rique implique que le rendu visuel sur un moniteur d\u00e9pendra fondamentalement de la fonction de transfert \u00e9lectro-optique du dispositif d&rsquo;affichage, introduisant ainsi une dissociation critique entre la donn\u00e9e matricielle brute et sa perception finale.<\/p>\n<h3>1.2 Pertinence m\u00e9thodologique en psychologie exp\u00e9rimentale et neurosciences cognitives<\/h3>\n<p>Au sein des laboratoires de psychologie cognitive et de neurophysiologie visuelle, l&#8217;emploi de stimuli en niveaux de gris ne rel\u00e8ve pas d&rsquo;une simple pr\u00e9f\u00e9rence esth\u00e9tique, mais d&rsquo;une rigoureuse n\u00e9cessit\u00e9 m\u00e9thodologique. Le premier imp\u00e9ratif concerne l&rsquo;\u00e9limination syst\u00e9matique des variables parasites li\u00e9es \u00e0 la saillance chromatique. Lors de protocoles mesurant l&rsquo;attention visuelle s\u00e9lective, l&rsquo;exploration oculom\u00e9trique ou l&rsquo;\u00e9valuation affective d&rsquo;images naturelles, la pr\u00e9sence de teintes satur\u00e9es induit des biais perceptifs massifs. Par exemple, la pr\u00e9sence d&rsquo;une composante rouge dans une sc\u00e8ne visuelle d\u00e9clenche une saillance exog\u00e8ne involontaire susceptible de court-circuiter les m\u00e9canismes d&rsquo;exploration descendante (<a rel=\"noopener noreferrer\" href=\"https:\/\/www.nature.com\/articles\/nrn1199\">top-down processing<\/a>) que le chercheur cherche pr\u00e9cis\u00e9ment \u00e0 isoler.<\/p>\n<p>En outre, la standardisation des stimuli visuels \u00e0 travers une \u00e9chelle d&rsquo;intensit\u00e9 unique est une condition indispensable pour la comparabilit\u00e9 des protocoles \u00e9valuant les temps de r\u00e9action motrice et les seuils diff\u00e9rentiels de d\u00e9tection. En calibrant finement la luminance moyenne et le contraste quadratique (Root-Mean-Square Contrast) de s\u00e9ries d&rsquo;images monochromatiques, l&rsquo;exp\u00e9rimentateur s&rsquo;assure que les variations observ\u00e9es dans les latences \u00e9lectroenc\u00e9phalographiques (notamment les composantes pr\u00e9coces telles que la P100 ou la N170) sont strictement imputables aux caract\u00e9ristiques structurales, s\u00e9mantiques ou spatiales du stimulus, et non \u00e0 des disparit\u00e9s de flux photonique atteignant la r\u00e9tine p\u00e9riph\u00e9rique du sujet test\u00e9.<\/p>\n<p>Sur le plan de l&rsquo;architecture fonctionnelle c\u00e9r\u00e9brale, l&rsquo;\u00e9chelle de gris pr\u00e9sente une compatibilit\u00e9 th\u00e9orique directe avec les mod\u00e8les de traitement primaire localis\u00e9s au sein de la voie visuelle magnocellulaire. Les cellules ganglionnaires r\u00e9tiniennes \u00e0 centre et pourtour antagonistes projetant vers les couches magnocellulaires du corps genouill\u00e9 lat\u00e9ral poss\u00e8dent une r\u00e9solution temporelle \u00e9lev\u00e9e et une sensibilit\u00e9 accrue aux tr\u00e8s faibles contrastes de luminance, tout en \u00e9tant totalement aveugles aux variations chromatiques (achromatisme fonctionnel). Travailler avec des matrices en niveaux de gris permet ainsi de mod\u00e9liser avec fid\u00e9lit\u00e9 les entr\u00e9es sensorielles primaires alimentant le cortex visuel primaire (aire stri\u00e9e V1), facilitant la confrontation entre pr\u00e9dictions th\u00e9oriques issues de filtres de Gabor et enregistrements empiriques.<\/p>\n<h3>1.3 R\u00f4le de l&rsquo;\u00e9cosyst\u00e8me Python et Matplotlib dans l&rsquo;analyse visuelle<\/h3>\n<p>Au cours des deux derni\u00e8res d\u00e9cennies, le langage de programmation Python a consolid\u00e9 sa position de standard h\u00e9g\u00e9monique pour le calcul scientifique, l&rsquo;intelligence artificielle et l&rsquo;analyse de donn\u00e9es exp\u00e9rimentales. Au c\u0153ur de cette architecture logicielle se trouve Matplotlib, une biblioth\u00e8que de visualisation d\u00e9velopp\u00e9e originellement par John D. Hunter pour reproduire l&rsquo;environnement d&rsquo;analyse matricielle de MATLAB au sein d&rsquo;un \u00e9cosyst\u00e8me ouvert et modulaire. Matplotlib ne constitue pas seulement une bo\u00eete \u00e0 outils de tra\u00e7age statistique ; elle int\u00e8gre un v\u00e9ritable moteur de rendu graphique vectoriel et matriciel capable d&rsquo;interagir nativement avec les structures de donn\u00e9es les plus complexes.<\/p>\n<p>L&rsquo;une des plus grandes forces de cet environnement r\u00e9side dans l&rsquo;interop\u00e9rabilit\u00e9 fluide entre trois biblioth\u00e8ques logicielles sp\u00e9cialis\u00e9es : <a rel=\"noopener noreferrer\" href=\"https:\/\/pillow.readthedocs.io\/\">Pillow<\/a> (la d\u00e9clinaison contemporaine de la biblioth\u00e8que historique PIL), con\u00e7ue pour l&rsquo;encodage, le d\u00e9codage et la gestion des flux de m\u00e9tadonn\u00e9es d&rsquo;images raster ; <a rel=\"noopener noreferrer\" href=\"https:\/\/numpy.org\/\">NumPy<\/a>, le socle de calcul tensoriel fournissant des tableaux denses en C contigu et des fonctions d&rsquo;alg\u00e8bre lin\u00e9aire hautement optimis\u00e9es ; et enfin le sous-module <code>matplotlib.pyplot<\/code>, d\u00e9di\u00e9 \u00e0 la composition sc\u00e9nographique, \u00e0 la cartographie des espaces colorim\u00e9triques et \u00e0 la rast\u00e9risation mat\u00e9rielle.<\/p>\n<p>L&rsquo;objectif m\u00e9thodologique de ce manuel d&rsquo;impl\u00e9mentation est de d\u00e9passer le niveau des recettes superficielles pour d\u00e9cortiquer pr\u00e9cis\u00e9ment chaque segment de l&rsquo;architecture d&rsquo;ex\u00e9cution sous-jacente. Il s&rsquo;agira d&rsquo;outiller le chercheur, l&rsquo;ing\u00e9nieur et le data scientist avec les concepts math\u00e9matiques et algorithmiques n\u00e9cessaires pour manipuler rigoureusement les matrices d&rsquo;intensit\u00e9, neutraliser les pi\u00e8ges courants li\u00e9s \u00e0 l&rsquo;interpr\u00e9tation colorim\u00e9trique par d\u00e9faut, et produire des visualisations irr\u00e9prochables tant sur le plan de la rigueur scientifique que de la pr\u00e9cision graphique.<\/p>\n<h2>2. Les principes fondamentaux de l&rsquo;affichage d&rsquo;images avec Matplotlib<\/h2>\n<h3>2.1 La fonction plt.imshow() et son fonctionnement sous-jacent<\/h3>\n<p>Au c\u0153ur du sous-module <code>matplotlib.pyplot<\/code>, la fonction <code>imshow()<\/code> (abr\u00e9viation transparente de <em>image show<\/em>) repr\u00e9sente le point d&rsquo;entr\u00e9e principal pour la visualisation de donn\u00e9es bidimensionnelles et tridimensionnelles. Sous une apparente simplicit\u00e9 syntaxique, cette fonction dissimule une cha\u00eene complexe de transformations g\u00e9om\u00e9triques et photom\u00e9triques. L&rsquo;architecture de <code>imshow()<\/code> ne se contente pas de dupliquer les pixels d&rsquo;un fichier source sur l&rsquo;\u00e9cran ; elle instancie un objet graphique d\u00e9di\u00e9 de la classe <code>matplotlib.image.AxesImage<\/code>, lequel est attach\u00e9 \u00e0 un syst\u00e8me de coordonn\u00e9es cart\u00e9siennes sp\u00e9cifi\u00e9 par un objet <code>Axes<\/code>.<\/p>\n<p>Le fonctionnement interne de cette m\u00e9thode repose sur une dissociation scrupuleuse entre la g\u00e9om\u00e9trie de la grille d&rsquo;\u00e9chantillonnage et la projection d&rsquo;intensit\u00e9. Lorsque <code>imshow()<\/code> re\u00e7oit un tableau en entr\u00e9e, elle applique d&rsquo;abord une transformation de coordonn\u00e9es projectives permettant d&rsquo;ajuster les proportions matricielles (l&rsquo;aspect ratio) \u00e0 l&rsquo;espace allou\u00e9 au canevas graphique. Dans le cas d&rsquo;une entr\u00e9e scalaire bidimensionnelle, l&rsquo;algorithme proc\u00e8de ensuite \u00e0 une \u00e9tape de normalisation affine des valeurs brutes avant de les propager \u00e0 travers une table de conversion colorim\u00e9trique (ou <em>lookup table<\/em>, LUT). Cette table associe \u00e0 chaque valeur scalaire un quadruplet vectoriel repr\u00e9sentant les intensit\u00e9s normalis\u00e9es de rouge, de vert, de bleu et d&rsquo;opacit\u00e9 alpha.<\/p>\n<p>La gestion de la m\u00e9moire au sein de l&rsquo;objet <code>AxesImage<\/code> s&rsquo;op\u00e8re de mani\u00e8re dynamique. Plut\u00f4t que de rast\u00e9riser imm\u00e9diatement l&rsquo;int\u00e9gralit\u00e9 de la matrice source \u00e0 la r\u00e9solution native de l&rsquo;image d&rsquo;origine, Matplotlib retarde la g\u00e9n\u00e9ration d\u00e9finitive des fragments de pixels jusqu&rsquo;\u00e0 l&rsquo;\u00e9tape d&rsquo;actualisation du rendu (g\u00e9n\u00e9ralement d\u00e9clench\u00e9e par <code>plt.show()<\/code>, <code>plt.draw()<\/code> ou <code>fig.savefig()<\/code>). Cette conception diff\u00e9r\u00e9e permet au moteur graphique d&rsquo;appliquer des filtres de r\u00e9-\u00e9chantillonnage spatial et d&rsquo;optimiser l&rsquo;occupation des tampons vid\u00e9o en fonction des dimensions physiques r\u00e9elles de la fen\u00eatre de tra\u00e7age, \u00e9vitant ainsi le gaspillage de ressources computationnelles lors de la manipulation de matrices de r\u00e9solution gigapixels.<\/p>\n<h3>2.2 Gestion des matrices multidimensionnelles et types de donn\u00e9es NumPy<\/h3>\n<p>L&rsquo;interfa\u00e7age entre les structures de donn\u00e9es NumPy et le moteur de Matplotlib repose sur un ensemble de conventions dimensionnelles et typologiques strictes. Matplotlib interpr\u00e8te la nature de l&rsquo;image projet\u00e9e en fonction exclusive de la dimensionnalit\u00e9 du tableau <code>ndarray<\/code> fourni en argument. Une matrice \u00e0 deux dimensions, formellement caract\u00e9ris\u00e9e par une forme (ou <em>shape<\/em>) \u00e9gale \u00e0 (hauteur, largeur), est intrins\u00e8quement comprise par le moteur de rendu comme un champ scalaire abstrait ou une image monochromatique. Dans cette configuration, chaque cellule spatiale ne contient qu&rsquo;une seule valeur num\u00e9rique d&rsquo;intensit\u00e9, n\u00e9cessitant l&rsquo;intervention d&rsquo;une table de correspondance pour \u00eatre mat\u00e9rialis\u00e9e \u00e0 l&rsquo;\u00e9cran.<\/p>\n<p>Inversement, les tenseurs tridimensionnels poss\u00e9dant une structure formelle de dimensions (hauteur, largeur, canaux) signalent imm\u00e9diatement au moteur d&rsquo;affichage la pr\u00e9sence d&rsquo;une image couleur composite. Si la taille du troisi\u00e8me axe dimensionnel est \u00e9gale \u00e0 3, les canaux sont invariablement assign\u00e9s aux composantes primaires rouge, vert et bleu. Si la profondeur est de 4, le quatri\u00e8me canal est trait\u00e9 comme un masque de transparence alpha r\u00e9gissant la synth\u00e8se additive finale sur le fond du canevas. Toute tentative de faire passer une matrice pseudo-monochrome conservant inutilement son troisi\u00e8me axe dimensionnel unitaire (par exemple une forme <code>(H, W, 1)<\/code>) d\u00e9clenchera une lev\u00e9e d&rsquo;exception ou un dysfonctionnement graphique, Matplotlib refusant d&rsquo;extrapoler arbitrairement le sens de tenseurs non standards.<\/p>\n<p>Au-del\u00e0 de la topologie g\u00e9om\u00e9trique du tableau, Matplotlib applique une heuristique discriminante fond\u00e9e sur le type de donn\u00e9es (<code>dtype<\/code>) de la matrice NumPy sous-jacente. Si le tableau est cod\u00e9 sous forme d&rsquo;entiers non sign\u00e9s sur 8 bits (<code>numpy.uint8<\/code>), l&rsquo;interpr\u00e9teur graphique impose d&#8217;embl\u00e9e une quantification discr\u00e8te sur la plage arithm\u00e9tique rigoureuse allant de 0 \u00e0 255. Dans cette situation, toute valeur num\u00e9rique franchissant ces bornes subit un d\u00e9passement arithm\u00e9tique (ou <em>integer overflow<\/em>), entra\u00eenant des inversions de polarit\u00e9 aberrantes. \u00c0 l&rsquo;inverse, d\u00e8s lors que le tableau est instanci\u00e9 avec des nombres r\u00e9els en virgule flottante (<code>numpy.float32<\/code> ou <code>numpy.float64<\/code>), Matplotlib modifie son comportement par d\u00e9faut : il s&rsquo;attend scrupuleusement \u00e0 ce que les valeurs soient d\u00e9j\u00e0 normalis\u00e9es dans l&rsquo;intervalle continu unitaire [0.0, 1.0]. Si un tableau flottant pr\u00e9sente des valeurs s&rsquo;\u00e9tendant arbitrairement de 0.0 \u00e0 255.0 sans normalisation ad\u00e9quate, les m\u00e9canismes automatiques de saturation \u00e9cr\u00eatent toutes les donn\u00e9es sup\u00e9rieures \u00e0 1.0, produisant une image quasi-int\u00e9gralement blanchie et totalement inexploitable.<\/p>\n<h3>2.3 Le comportement d&rsquo;affichage par d\u00e9faut face aux images trichromes (RGB)<\/h3>\n<p>Une incompr\u00e9hension fr\u00e9quente chez les praticiens concerne la r\u00e9action de Matplotlib lorsqu&rsquo;une commande d&rsquo;affichage de type niveaux de gris est appliqu\u00e9e directement \u00e0 une image trichromatique sans restructuration matricielle pr\u00e9alable. Lorsqu&rsquo;un tenseur de dimensions <code>(M, N, 3)<\/code> est transmis \u00e0 la m\u00e9thode <code>imshow()<\/code>, le sous-syst\u00e8me de tra\u00e7age identifie imm\u00e9diatement la pr\u00e9sence des trois flux spectraux et active son canal de rendu direct RGB. Dans ce mode op\u00e9ratoire, chaque triplet de pixels est trait\u00e9 comme une instruction colorim\u00e9trique immuable, directement mapp\u00e9e vers le tampon de trames (<em>framebuffer<\/em>) de la carte graphique.<\/p>\n<p>La cons\u00e9quence directe et fondamentale de ce m\u00e9canisme interne est la neutralisation pure et simple de l&rsquo;argument de table de correspondance colorim\u00e9trique explicite. Quand bien m\u00eame l&rsquo;op\u00e9rateur sp\u00e9cifierait avec insistance le param\u00e8tre <code>cmap='gray'<\/code> au sein de l&rsquo;instruction <code>plt.imshow(rgb_array, cmap='gray')<\/code>, cette directive sera scrupuleusement et silencieusement ignor\u00e9e par Matplotlib. Le moteur n&rsquo;\u00e9met aucun message d&rsquo;avertissement ni d&rsquo;erreur : consid\u00e9rant que l&rsquo;utilisateur a fourni des composantes de couleur explicites, il juge le recours \u00e0 une table de correspondance scalaire sans objet et affiche l&rsquo;image dans sa polychromie d&rsquo;origine.<\/p>\n<p>Cette observation met en lumi\u00e8re un principe cl\u00e9 du traitement d&rsquo;images num\u00e9riques : l&rsquo;affichage en niveaux de gris n&rsquo;est pas une simple modalit\u00e9 d&rsquo;habillage graphique que l&rsquo;on pourrait solliciter \u00e0 la derni\u00e8re \u00e9tape de restitution visuelle. Il requiert imp\u00e9rativement une transformation structurelle en amont, op\u00e9rant au c\u0153ur m\u00eame de la matrice de donn\u00e9es. L&rsquo;image doit subir une v\u00e9ritable transformation math\u00e9matique de projection, condensant irr\u00e9vocablement ses trois canaux de couleur en un plan scalaire bidimensionnel unique avant que la moindre fonction de tra\u00e7age ne soit invoqu\u00e9e.<\/p>\n<h2>3. Le chargement et la manipulation pr\u00e9liminaire des images avec PIL (Pillow)<\/h2>\n<h3>3.1 Importation et ouverture de fichiers d&rsquo;images matricielles<\/h3>\n<p>Dans l&rsquo;architecture logicielle de traitement de donn\u00e9es sous Python, la biblioth\u00e8que Pillow constitue le composant de r\u00e9f\u00e9rence pour l&rsquo;interaction avec le syst\u00e8me de fichiers et la d\u00e9compression des formats graphiques matriciels. L&rsquo;op\u00e9ration d&rsquo;importation fondamentale d\u00e9bute par l&rsquo;invocation de la m\u00e9thode <code>Image.open()<\/code> issue du module <code>PIL<\/code>. Cette m\u00e9thode impl\u00e9mente un m\u00e9canisme d&rsquo;\u00e9valuation paresseuse (<em>lazy evaluation<\/em>) particuli\u00e8rement robuste. Lors de son ex\u00e9cution, le moteur ne charge pas imm\u00e9diatement la totalit\u00e9 des donn\u00e9es binaires matricielles au sein de la m\u00e9moire vive ; il se contente d&rsquo;inspecter l&rsquo;en-t\u00eate du fichier binaire pour identifier son format d&rsquo;encodage (qu&rsquo;il s&rsquo;agisse d&rsquo;un fichier JPEG \u00e0 transform\u00e9e en cosinus discr\u00e8te, d&rsquo;un PNG \u00e0 compression sans perte Deflate, ou d&rsquo;un conteneur TIFF multipage scientifique) et en extraire les m\u00e9tadonn\u00e9es capitales.<\/p>\n<p>Cette architecture paresseuse garantit une remarquable efficacit\u00e9 m\u00e9moire, particuli\u00e8rement utile lors du parcours it\u00e9ratif de vastes r\u00e9pertoires contenant des milliers de stimuli visuels destin\u00e9s \u00e0 des protocoles exp\u00e9rimentaux. Cependant, cette conception implique que l&rsquo;int\u00e9grit\u00e9 physique int\u00e9grale des blocs de donn\u00e9es n&rsquo;est valid\u00e9e qu&rsquo;au moment o\u00f9 une op\u00e9ration effective d&rsquo;acc\u00e8s aux pixels ou de conversion matricielle est formellement requise. Pour se pr\u00e9munir contre d&rsquo;\u00e9ventuelles corruptions de fichiers survenues lors du transfert ou de l&rsquo;\u00e9criture disque, il est souvent judicieux de solliciter explicitement la m\u00e9thode <code>load()<\/code> ou de structurer l&rsquo;ouverture au sein d&rsquo;un bloc de gestion de contexte <code>with Image.open(...) as img:<\/code>, garantissant une fermeture propre des descripteurs de fichiers syst\u00e8me associ\u00e9s.<\/p>\n<p>Un autre d\u00e9fi technique r\u00e9current r\u00e9side dans l&rsquo;h\u00e9t\u00e9rog\u00e9n\u00e9it\u00e9 des canaux auxiliaires int\u00e9gr\u00e9s au sein de certains conteneurs graphiques. Les images issues du web ou d&rsquo;interfaces graphiques int\u00e8grent fr\u00e9quemment un quatri\u00e8me canal d&rsquo;opacit\u00e9, d\u00e9sign\u00e9 sous le terme de canal alpha. L&rsquo;existence de ce canal suppl\u00e9tif complique significativement la manipulation matricielle ult\u00e9rieure : il ne participe pas directement \u00e0 la luminance \u00e9nerg\u00e9tique de la sc\u00e8ne mais d\u00e9finit le degr\u00e9 d&rsquo;occlusion g\u00e9om\u00e9trique par rapport \u00e0 un arri\u00e8re-plan ind\u00e9termin\u00e9. Pillow permet de d\u00e9celer cette composante d\u00e8s la lecture initiale, pr\u00e9parant ainsi l&rsquo;application des \u00e9tapes de fusion ou de suppression indispensables \u00e0 l&rsquo;obtention d&rsquo;un signal photom\u00e9trique pur.<\/p>\n<figure class=\"wpt-preserved-image\"><img fetchpriority=\"high\" decoding=\"async\" src=\"http:\/\/french.arabpsychology.com\/wp-content\/uploads\/2026\/09\/shapes.jpg\" alt=\"\" \/><\/figure>\n<h3>3.2 Analyse des dimensions spatiales et des canaux de couleur<\/h3>\n<p>D\u00e8s l&rsquo;instanciation de l&rsquo;objet graphique au sein de la m\u00e9moire tampon de Pillow, la premi\u00e8re d\u00e9marche diagnostique consiste \u00e0 sonder rigoureusement ses propri\u00e9t\u00e9s intrins\u00e8ques \u00e0 travers deux attributs fondamentaux : <code>size<\/code> et <code>mode<\/code>. L&rsquo;attribut <code>size<\/code> retourne un tuple d&rsquo;entiers structur\u00e9 selon la convention cart\u00e9sienne horizontale\/verticale <code>(largeur, hauteur)<\/code>. Il convient de souligner avec force une divergence structurelle critique qui constitue un pi\u00e8ge classique pour les chercheurs d\u00e9butants : Pillow quantifie l&rsquo;espace selon le rep\u00e8re usuel des abscisses et des ordonn\u00e9es <code>(X, Y)<\/code>, alors que la biblioth\u00e8que NumPy, ob\u00e9issant aux conventions s\u00e9culaires de l&rsquo;alg\u00e8bre matricielle, structure syst\u00e9matiquement ses dimensions selon l&rsquo;ordre <code>(lignes, colonnes)<\/code>, ce qui correspond g\u00e9om\u00e9triquement \u00e0 <code>(hauteur, largeur)<\/code>.<\/p>\n<p>L&rsquo;attribut <code>mode<\/code>, quant \u00e0 lui, renvoie une cha\u00eene de caract\u00e8res sp\u00e9cifiant sans ambigu\u00eft\u00e9 l&rsquo;espace colorim\u00e9trique et la profondeur d&rsquo;\u00e9chantillonnage binaire sous lesquels le fichier a \u00e9t\u00e9 encod\u00e9. Les modes les plus fr\u00e9quemment rencontr\u00e9s dans les environnements de laboratoire comprennent :<\/p>\n<ul>\n<li><strong>RGB :<\/strong> \u00c9chantillonnage standard sur 3 canaux de 8 bits chacun, couvrant l&rsquo;espace colorim\u00e9trique trichrome additif standard (plage de 0 \u00e0 255 par canal).<\/li>\n<li><strong>RGBA :<\/strong> Extension \u00e0 4 canaux incorporant un canal alpha de transparence sur 8 bits en sus des composantes trichromes.<\/li>\n<li><strong>L :<\/strong> Codage monochromatique \u00e0 canal unique sur 8 bits, repr\u00e9sentant explicitement la luminance (plage de 0 \u00e0 255).<\/li>\n<li><strong>CMYK :<\/strong> Mod\u00e8le de synth\u00e8se soustractive sur 4 canaux, utilis\u00e9 de mani\u00e8re pr\u00e9dominante dans les processus de photogravure et d&rsquo;impression industrielle.<\/li>\n<li><strong>1 :<\/strong> \u00c9chelle binaire stricte \u00e0 un seul bit par pixel, o\u00f9 chaque \u00e9l\u00e9ment matriciel ne peut valoir que 0 ou 1 (noir pur ou blanc pur).<\/li>\n<\/ul>\n<p>La cartographie pr\u00e9cise de cet espace colorim\u00e9trique d&rsquo;origine est une condition pr\u00e9alable imp\u00e9rative avant d&rsquo;appliquer une quelconque m\u00e9thode de transformation en niveaux de gris. Une image encod\u00e9e en <code>CMYK<\/code> ou en <code>RGBA<\/code> ne peut \u00eatre convertie selon les m\u00eames formules lin\u00e9aires directes qu&rsquo;une image <code>RGB<\/code> standard, sous peine d&rsquo;induire des corruptions s\u00e9v\u00e8res dans les rapports d&rsquo;intensit\u00e9 ou de projeter des composantes d&rsquo;encres ou d&rsquo;opacit\u00e9 en lieu et place de l&rsquo;intensit\u00e9 lumineuse recherch\u00e9e.<\/p>\n<h3>3.3 Int\u00e9gration fluide entre PIL et NumPy via np.asarray()<\/h3>\n<p>Une fois l&rsquo;image correctement instanci\u00e9e et contr\u00f4l\u00e9e sur le plan dimensionnel, il est n\u00e9cessaire de l&rsquo;extraire du mod\u00e8le d&rsquo;objet propri\u00e9taire de Pillow afin de la transformer en une entit\u00e9 manipulable par les op\u00e9rateurs tensoriels de calcul vectoriel. La m\u00e9thode contemporaine la plus \u00e9l\u00e9gante et efficiente pour accomplir cette passerelle consiste \u00e0 employer la fonction <a rel=\"noopener noreferrer\" href=\"https:\/\/numpy.org\/doc\/stable\/reference\/generated\/numpy.asarray.html\">numpy.asarray()<\/a>. Contrairement \u00e0 la fonction g\u00e9n\u00e9rique <code>numpy.array()<\/code>, qui proc\u00e8de syst\u00e9matiquement \u00e0 une duplication d\u00e9fensive int\u00e9grale des blocs m\u00e9moires sous-jacents, <code>numpy.asarray()<\/code> cherche en priorit\u00e9 \u00e0 cr\u00e9er une vue (<em>view<\/em>) matricielle index\u00e9e directement sur le tampon binaire continu d\u00e9j\u00e0 allou\u00e9 par Pillow.<\/p>\n<p>Ce m\u00e9canisme d&#8217;emprunt de m\u00e9moire sans copie superflue (<em>zero-copy data sharing<\/em>) procure des gains de performance substantiels, particuli\u00e8rement lorsque les cha\u00eenes de traitement doivent ing\u00e9rer en flux continu des flux d&rsquo;images vid\u00e9o ou des tenseurs biom\u00e9dicaux \u00e0 tr\u00e8s haute r\u00e9solution spatiale. La structure matricielle r\u00e9sultante adopte instantan\u00e9ment le type de donn\u00e9es appropri\u00e9, g\u00e9n\u00e9ralement <code>numpy.uint8<\/code> si l&rsquo;objet Pillow \u00e9tait encod\u00e9 sur 8 bits par canal, tout en pr\u00e9servant scrupuleusement l&rsquo;int\u00e9grit\u00e9 num\u00e9rique des valeurs d&rsquo;origine.<\/p>\n<p>Il demeure toutefois indispensable de v\u00e9rifier la coh\u00e9rence structurelle de cette transition. Le passage \u00e0 NumPy permute imm\u00e9diatement la hi\u00e9rarchie des axes pour s&rsquo;aligner sur la disposition matricielle : une image Pillow de dimensions <code>(largeur=1920, hauteur=1080)<\/code> en mode <code>RGB<\/code> devient instantan\u00e9ment un tableau NumPy de dimensions <code>(1080, 1920, 3)<\/code>. L&rsquo;acc\u00e8s aux coordonn\u00e9es individuelles s&rsquo;effectue d\u00e8s lors au moyen des indices d&rsquo;acc\u00e8s aux lignes et aux colonnes <code>array[y, x]<\/code>. Cette coh\u00e9rence structurelle est le garant absolu de la validit\u00e9 des calculs matriciels ult\u00e9rieurs, assurant qu&rsquo;aucun glissement de perspective spatiale ne vienne fausser les analyses statistiques ou les algorithmes de filtrage spatial.<\/p>\n<h2>4. La conversion en niveaux de gris avec le mode &lsquo;L&rsquo; de PIL<\/h2>\n<h3>4.1 Signification technique et algorithmique du mode &lsquo;L&rsquo; (Luminance)<\/h3>\n<p>L&rsquo;op\u00e9ration centrale permettant de transformer une image couleur polymorphe en une repr\u00e9sentation scalaire pure consiste \u00e0 invoquer la m\u00e9thode de conversion d\u00e9di\u00e9e de Pillow, concr\u00e9tis\u00e9e par la ligne d&rsquo;instruction <code>image.convert('L')<\/code>. Dans la nomenclature interne de la biblioth\u00e8que PIL\/Pillow, le caract\u00e8re unique <code>'L'<\/code> fait directement r\u00e9f\u00e9rence au concept photom\u00e9trique de <em>Luminance<\/em>. Cette op\u00e9ration r\u00e9alise une r\u00e9duction dimensionnelle irr\u00e9versible en fusionnant les multiples canaux spectraux en une seule nappe scalaire d&rsquo;\u00e9chantillons d&rsquo;intensit\u00e9 cod\u00e9s sur 8 bits non sign\u00e9s.<\/p>\n<p>D&rsquo;un point de vue algorithmique, chaque pixel individuel de l&rsquo;image source \u2014 initialement d\u00e9fini par un vecteur trichromatique \u00e0 trois composantes scalaires <span class=\"arabpsy-math-inline\" data-latex=\"(R, G, B)\">$(R, G, B)$<\/span> \u2014 est projet\u00e9 sur un unique scalaire <span class=\"arabpsy-math-inline\" data-latex=\"Y\">$Y$<\/span>. Cette nouvelle grandeur num\u00e9rique est ensuite contrainte dans l&rsquo;intervalle entier ferm\u00e9 <span class=\"arabpsy-math-inline\" data-latex=\"[0, 255]\">$[0, 255]$<\/span>. La cons\u00e9quence imm\u00e9diate de cette conversion est l&rsquo;an\u00e9antissement de l&rsquo;information de chromaticit\u00e9 : les longueurs d&rsquo;onde sp\u00e9cifiques \u00e9mises par la sc\u00e8ne sont d\u00e9finitivement \u00e9limin\u00e9es au profit de la seule magnitude d&rsquo;\u00e9clairement relatif.<\/p>\n<p>Il est fondamental de comprendre pourquoi l&rsquo;omission de cette \u00e9tape pr\u00e9cise de conversion emp\u00eache formellement la gen\u00e8se d&rsquo;une v\u00e9ritable matrice bidimensionnelle d&rsquo;\u00e9chelle de gris. Si un utilisateur tente d&rsquo;extraire directement un tableau NumPy \u00e0 partir d&rsquo;un objet image couleur sans solliciter <code>convert('L')<\/code>, le tableau r\u00e9sultant conservera obstin\u00e9ment ses trois axes dimensionnels <span class=\"arabpsy-math-inline\" data-latex=\"(H, W, 3)\">$(H, W, 3)$<\/span>. D\u00e8s lors, comme nous l&rsquo;avons explicit\u00e9 pr\u00e9c\u00e9demment, toute tentative d&rsquo;imposer un affichage monochrome au moyen d&rsquo;arguments d&rsquo;habillage graphique sera vou\u00e9e \u00e0 l&rsquo;\u00e9chec, le pipeline graphique de Matplotlib privil\u00e9giant la lecture matricielle directe des canaux spectraux par rapport \u00e0 la colormap monochrome.<\/p>\n<h3>4.2 Formules de pond\u00e9ration photom\u00e9trique (norme ITU-R BT.601)<\/h3>\n<p>La fusion des composantes rouge, verte et bleue en une valeur scalaire de luminance n&rsquo;est pas le fruit d&rsquo;une simple moyenne arithm\u00e9tique non pond\u00e9r\u00e9e. R\u00e9aliser une conversion en appliquant la formule simpliste <span class=\"arabpsy-math-inline\" data-latex=\"(R + G + B) \/ 3\">$(R + G + B) \/ 3$<\/span> constituerait une faute m\u00e9thodologique majeure en imagerie num\u00e9rique et en sciences de la vision. L&rsquo;appareil visuel humain ne pr\u00e9sente pas une sensibilit\u00e9 spectrale uniforme aux diff\u00e9rentes longueurs d&rsquo;onde du spectre visible : les c\u00f4nes r\u00e9tiniens de types L, M et S pr\u00e9sentent des distributions spatiales et des rendements quantiques radicalement h\u00e9t\u00e9rog\u00e8nes.<\/p>\n<p>Pour refl\u00e9ter cette r\u00e9alit\u00e9 neurophysiologique, Pillow impl\u00e9mente lors de l&rsquo;appel \u00e0 <code>convert('L')<\/code> la formule de pond\u00e9ration photom\u00e9trique standardis\u00e9e par le secteur des radiocommunications de l&rsquo;Union Internationale des T\u00e9l\u00e9communications sous la d\u00e9signation <a rel=\"noopener noreferrer\" href=\"https:\/\/www.itu.int\/rec\/R-REC-BT.601\">ITU-R Recommendation BT.601<\/a>. Cette norme internationale stipule que la luminance <span class=\"arabpsy-math-inline\" data-latex=\"Y\">$Y$<\/span> est calcul\u00e9e selon l&rsquo;\u00e9quation lin\u00e9aire pond\u00e9r\u00e9e suivante :<\/p>\n<p><span class=\"arabpsy-math-display\" data-latex=\"Y = 0.299 \\times R + 0.587 \\times G + 0.114 \\times B\">$$Y = 0.299 \\times R + 0.587 \\times G + 0.114 \\times B$$<\/span><\/p>\n<p>Cette distribution asym\u00e9trique des coefficients \u2014 attribuant pr\u00e8s de 59 % du poids total \u00e0 la composante verte, 30 % \u00e0 la composante rouge et seulement 11 % \u00e0 la composante bleue \u2014 trouve sa justification \u00e9volutive et biologique dans la concentration pr\u00e9pond\u00e9rante des r\u00e9cepteurs photopiques sensibles aux longueurs d&rsquo;onde moyennes au sein de la fov\u00e9a humaine. Une sc\u00e8ne domin\u00e9e par un vert \u00e9meraude pur sera naturellement per\u00e7ue par un observateur humain comme beaucoup plus lumineuse et \u00e9clatante qu&rsquo;une sc\u00e8ne d&rsquo;intensit\u00e9 physique \u00e9quivalente illumin\u00e9e par un bleu profond ou un pourpre satur\u00e9. En appliquant rigoureusement les coefficients de la norme BT.601, la m\u00e9thode <code>convert('L')<\/code> assure que les contrastes relatifs per\u00e7us dans la version en niveaux de gris refl\u00e8tent fid\u00e8lement la hi\u00e9rarchie perceptive originelle des contrastes de la sc\u00e8ne polychrome.<\/p>\n<h3>4.3 Cons\u00e9quences structurelles sur le tableau NumPy r\u00e9sultant<\/h3>\n<p>L&rsquo;impact de la m\u00e9thode <code>convert('L')<\/code> devient pleinement manifeste lorsque l&rsquo;on proc\u00e8de \u00e0 la projection du flux r\u00e9sultant vers un tableau NumPy \u00e0 l&rsquo;aide de <code>np.asarray(image.convert('L'))<\/code>. La modification la plus d\u00e9terminante concerne la topologie m\u00eame du tenseur de donn\u00e9es : l&rsquo;op\u00e9ration \u00e9lague d\u00e9finitivement le troisi\u00e8me axe orthogonal du tableau. Si la matrice couleur d&rsquo;origine poss\u00e9dait une dimensionnalit\u00e9 d&rsquo;ordre 3 caract\u00e9ris\u00e9e par une forme <code>(hauteur, largeur, 3)<\/code>, la nouvelle matrice issue de la conversion acquiert une structure matricielle pure d&rsquo;ordre 2, caract\u00e9ris\u00e9e par une forme canonique <code>(hauteur, largeur)<\/code>.<\/p>\n<p>Cette restructuration tensorielle entra\u00eene une r\u00e9duction imm\u00e9diate et spectaculaire de l&#8217;empreinte de la matrice au sein de la m\u00e9moire vive du syst\u00e8me. La taille en octets du tampon de pixels est rigoureusement divis\u00e9e par trois, un avantage d\u00e9terminant lorsque des protocoles exp\u00e9rimentaux imposent le pr\u00e9-chargement en m\u00e9moire de banques volumineuses de plusieurs dizaines de milliers de stimuli photographiques avant le d\u00e9clenchement des essais comportementaux chronom\u00e9tr\u00e9s. L&rsquo;optimisation des structures de donn\u00e9es all\u00e8ge la charge sur le gestionnaire de m\u00e9moire de l&rsquo;interpr\u00e9teur Python et supprime les risques de micro-latences caus\u00e9es par le ramasse-miettes (<em>garbage collector<\/em>) durant la passation des sujets.<\/p>\n<p>Enfin, cette perte du troisi\u00e8me axe dimensionnel est le d\u00e9clencheur technique incontournable qui conditionne le comportement ult\u00e9rieur de Matplotlib. En l&rsquo;absence de canaux spectraux concurrents, la matrice <code>(M, N)<\/code> devient une description univoque et universelle d&rsquo;un champ d&rsquo;amplitudes scalaires r\u00e9parties sur une grille g\u00e9om\u00e9trique. C&rsquo;est pr\u00e9cis\u00e9ment et uniquement cette structure bidimensionnelle pure qui rend possible l&rsquo;application cibl\u00e9e, param\u00e9tr\u00e9e et d\u00e9terministe d&rsquo;une table de correspondance colorim\u00e9trique monochrome au sein du moteur <code>imshow()<\/code>.<\/p>\n<h2>5. Mise en \u0153uvre pratique : Affichage d&rsquo;une image en niveaux de gris (Exemple pas-\u00e0-pas)<\/h2>\n<h3>5.1 Code complet et ex\u00e9cution s\u00e9quentielle d\u00e9taill\u00e9e<\/h3>\n<p>Afin de mat\u00e9rialiser l&rsquo;ensemble de ces concepts th\u00e9oriques au sein d&rsquo;une impl\u00e9mentation concr\u00e8te, analysons en d\u00e9tail le script de r\u00e9f\u00e9rence permettant de charger un fichier graphique, d&rsquo;op\u00e9rer la conversion en luminance matricielle et d&rsquo;en assurer la restitution visuelle irr\u00e9prochable sous la forme d&rsquo;un tableau en niveaux de gris. Chaque instruction de cette s\u00e9quence est con\u00e7ue pour garantir une ex\u00e9cution robuste et sans \u00e9quivoque.<\/p>\n<p>Consid\u00e9rons la formulation s\u00e9quentielle suivante :<\/p>\n<p>Dans un premier temps, l&rsquo;environnement logiciel requiert l&rsquo;importation conjointe des modules <code>matplotlib.pyplot<\/code>, du module <code>Image<\/code> extrait du package <code>PIL<\/code>, ainsi que de la biblioth\u00e8que <code>numpy<\/code>. La s\u00e9quence d&rsquo;ex\u00e9cution d\u00e9bute par le chargement du fichier source \u00e0 l&rsquo;aide de la commande : <code>image_pil = Image.open('stimulus_visuel.jpg')<\/code>. \u00c0 ce stade, comme nous l&rsquo;avons explicit\u00e9, les m\u00e9tadonn\u00e9es sont lues, mais les pixels demeurent sous forme compress\u00e9e sur le support de stockage.<\/p>\n<p>L&rsquo;\u00e9tape suivante op\u00e8re la dissociation chromatique et la projection en luminance pure : <code>gray_pil = image_pil.convert('L')<\/code>. Le moteur algorithmique applique ici la formule de pond\u00e9ration ITU-R BT.601 pixel par pixel. Une fois cette \u00e9tape accomplie, la conversion matricielle sans duplication est mat\u00e9rialis\u00e9e par l&rsquo;instruction : <code>gray_array = np.asarray(gray_pil)<\/code>. Un contr\u00f4le de routine sur <code>gray_array.shape<\/code> permet de v\u00e9rifier que la forme correspond rigoureusement \u00e0 deux dimensions scalaires <code>(H, W)<\/code> et que le type sous-jacent est bien <code>uint8<\/code>.<\/p>\n<p>La finalisation graphique se concr\u00e9tise alors par l&rsquo;invocation explicite de l&rsquo;interpr\u00e9teur de tra\u00e7age : <code>plt.imshow(gray_array, cmap='gray')<\/code>, imm\u00e9diatement suivie par la commande de d\u00e9sactivation des rep\u00e8res spatiaux <code>plt.axis('off')<\/code> pour un rendu \u00e9pur\u00e9, et enfin par <code>plt.show()<\/code> pour afficher la sc\u00e8ne. Le moteur graphique g\u00e9n\u00e8re la sc\u00e8ne dans la fen\u00eatre de rendu avec une exactitude photom\u00e9trique optimale.<\/p>\n<figure class=\"wpt-preserved-image\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/french.arabpsychology.com\/wp-content\/uploads\/2026\/09\/gray1.jpg\" alt=\"\" \/><\/figure>\n<h3>5.2 L&rsquo;utilisation explicite du param\u00e8tre cmap=&rsquo;gray&rsquo;<\/h3>\n<p>L&rsquo;attribution de la cha\u00eene de caract\u00e8res <code>'gray'<\/code> au param\u00e8tre <code>cmap<\/code> (colloquialisme pour <em>colormap<\/em>) au sein de l&rsquo;instruction <code>plt.imshow()<\/code> constitue la clef de vo\u00fbte de toute cette proc\u00e9dure de visualisation. Le r\u00f4le de cet argument est de fournir une table de conversion formelle traduisant de mani\u00e8re strictement lin\u00e9aire chaque valeur scalaire contenue dans la matrice NumPy vers un niveau d&rsquo;intensit\u00e9 lumineuse achromatique sur l&rsquo;\u00e9cran.<\/p>\n<p>Dans cette configuration sp\u00e9cifique, la table <code>'gray'<\/code> associe \u00e0 la valeur scalaire minimale (qui est 0 dans le cadre d&rsquo;un tableau de type <code>uint8<\/code>) un quadruplet RGBA correspondant au noir absolu <code>[0.0, 0.0, 0.0, 1.0]<\/code>. R\u00e9ciproquement, elle assigne \u00e0 la valeur maximale admissible (255) le quadruplet associ\u00e9 au blanc spectral maximal <code>[1.0, 1.0, 1.0, 1.0]<\/code>. Pour l&rsquo;ensemble des valeurs interm\u00e9diaires r\u00e9parties entre ces deux bornes, la fonction applique une rampe affine continue o\u00f9 les trois canaux rouge, vert et bleu re\u00e7oivent des valeurs d&rsquo;excitation identiques, garantissant une absence totale de saturation chromatique ou de d\u00e9rive de teinte (<em>hue<\/em>) perceptible.<\/p>\n<p>Il est fondamental de r\u00e9it\u00e9rer qu&rsquo;en l&rsquo;absence de ce param\u00e8tre explicite, l&rsquo;affichage ne sera pas en niveaux de gris, quand bien m\u00eame la matrice d&rsquo;entr\u00e9e serait structurellement bidimensionnelle. \u00c0 l&rsquo;inverse, si l&rsquo;on tente d&rsquo;appliquer <code>cmap='gray'<\/code> \u00e0 un tableau qui n&rsquo;a pas subi la conversion structurelle pr\u00e9alable et qui poss\u00e8de toujours ses trois canaux RGB, le param\u00e8tre sera totalement inop\u00e9rant. L&rsquo;affichage en niveaux de gris valide et reproductible est donc le fruit indissociable de la conjonction entre une matrice 2D pure et l&rsquo;attribution explicite d&rsquo;une colormap monochrome.<\/p>\n<figure class=\"wpt-preserved-image\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/french.arabpsychology.com\/wp-content\/uploads\/2026\/09\/gray2.jpg\" alt=\"Matplotlib grayscale image\" \/><figcaption>Matplotlib grayscale image<\/figcaption><\/figure>\n<h3>5.3 Comparaison visuelle entre l&rsquo;image originale et le rendu d\u00e9satur\u00e9<\/h3>\n<p>Pour valider la conformit\u00e9 d&rsquo;une cha\u00eene de pr\u00e9traitement visuel dans le cadre d&rsquo;une \u00e9tude exp\u00e9rimentale, il est d&rsquo;usage d&rsquo;\u00e9laborer une interface graphique comparative juxtaposant l&rsquo;image originale polychrome et sa contrepartie d\u00e9satur\u00e9e. Cette d\u00e9marche permet de v\u00e9rifier de visu que les structures spatiales d&rsquo;int\u00e9r\u00eat, les fronti\u00e8res de textures et les gradients d&rsquo;illumination sont demeur\u00e9s intacts malgr\u00e9 la suppression totale de l&rsquo;information de chromaticit\u00e9.<\/p>\n<p>L&rsquo;impl\u00e9mentation de cette confrontation analytique s&rsquo;op\u00e8re couramment par le recours \u00e0 la m\u00e9thode <code>plt.subplots()<\/code>, g\u00e9n\u00e9rant une figure fragment\u00e9e en plusieurs sous-r\u00e9gions d&rsquo;affichage (ou <em>subplots<\/em>). Consid\u00e9rons l&rsquo;architecture de comparaison suivante :<\/p>\n<ul>\n<li>Cr\u00e9ation d&rsquo;une figure partitionn\u00e9e : <code>fig, axes = plt.subplots(1, 2, figsize=(12, 6))<\/code>, instanciant un canevas horizontal compos\u00e9 de deux panneaux d&rsquo;affichage ind\u00e9pendants.<\/li>\n<li>Restitution de l&rsquo;image trichrome originelle sur le premier axe : <code>axes[0].imshow(image_pil)<\/code>, avec adjonction d&rsquo;un titre s\u00e9mantique <code>axes[0].set_title('Stimulus Original (RGB)')<\/code>.<\/li>\n<li>Restitution de l&rsquo;image projet\u00e9e en luminance sur le second axe : <code>axes[1].imshow(gray_array, cmap='gray')<\/code>, enrichie de son label m\u00e9thodologique <code>axes[1].set_title('Luminance Norm\u00e9e (ITU-R BT.601)')<\/code>.<\/li>\n<li>Suppression conjointe des axes p\u00e9riph\u00e9riques au moyen d&rsquo;une it\u00e9ration contr\u00f4l\u00e9e : <code>for ax in axes: ax.axis('off')<\/code>, garantissant l&rsquo;absence de biais g\u00e9om\u00e9triques p\u00e9riph\u00e9riques.<\/li>\n<\/ul>\n<p>Cette analyse visuelle comparative permet de constater avec pr\u00e9cision la pr\u00e9servation absolue des contours morphologiques. Alors que les transitions de teintes (par exemple entre une fleur rouge et son feuillage vert d&rsquo;intensit\u00e9 \u00e9quivalente) perdent leur diff\u00e9renciation chromatique franche, leur s\u00e9paration photom\u00e9trique est fid\u00e8lement maintenue gr\u00e2ce au diff\u00e9rentiel de pond\u00e9ration spectrale de la norme BT.601. Cette v\u00e9rification qualitative constitue une \u00e9tape pr\u00e9liminaire obligatoire pour valider la pertinence \u00e9cologique d&rsquo;un ensemble de stimuli avant leur d\u00e9ploiement dans des t\u00e2ches comportementales de cat\u00e9gorisation rapide ou d&rsquo;amor\u00e7age subliminal.<\/p>\n<h2>6. Pourquoi cmap=&rsquo;gray&rsquo; est indispensable : Comprendre la colorisation par d\u00e9faut<\/h2>\n<h3>6.1 Le pi\u00e8ge de la colormap par d\u00e9faut (&lsquo;viridis&rsquo;) sur un tableau 2D<\/h3>\n<p>L&rsquo;un des comportements les plus d\u00e9routants pour les chercheurs abordant pour la premi\u00e8re fois l&rsquo;affichage de matrices bidimensionnelles dans Matplotlib r\u00e9side dans l&rsquo;apparition spontan\u00e9e d&rsquo;une image chatoyante aux nuances de jaune, de vert et de violet, alors m\u00eame que le tableau de donn\u00e9es sous-jacent est rigoureusement monochrome. Cette manifestation graphique, per\u00e7ue \u00e0 tort comme une anomalie du syst\u00e8me, d\u00e9coule d&rsquo;un choix de conception m\u00fbrement r\u00e9fl\u00e9chi par les d\u00e9veloppeurs de Matplotlib : l&rsquo;application universelle de la table de correspondance colorim\u00e9trique par d\u00e9faut, baptis\u00e9e <a rel=\"noopener noreferrer\" href=\"https:\/\/bids.github.io\/colormap\/\">&lsquo;viridis&rsquo;<\/a>.<\/p>\n<p>Historiquement, jusqu&rsquo;\u00e0 la version 1.5 de Matplotlib, la palette appliqu\u00e9e par d\u00e9faut \u00e0 toute matrice scalaire d\u00e9pourvue de sp\u00e9cification <code>cmap<\/code> \u00e9tait <code>'jet'<\/code>, une rampe arc-en-ciel interpolant brutalement du bleu au rouge en passant par le cyan et le jaune. Devant les vives critiques de la communaut\u00e9 scientifique d\u00e9non\u00e7ant les artefacts de perception introduits par la non-lin\u00e9arit\u00e9 s\u00e9v\u00e8re de <code>'jet'<\/code>, l&rsquo;\u00e9quipe centrale de Matplotlib a d\u00e9velopp\u00e9 <code>'viridis'<\/code>. Cette colormap a \u00e9t\u00e9 math\u00e9matiquement optimis\u00e9e pour offrir une progression perceptivement uniforme de la luminance tout en restant accessible aux personnes souffrant de d\u00e9ficiences de la vision des couleurs (daltonisme).<\/p>\n<p>Cependant, lorsqu&rsquo;un praticien transmet une matrice 2D issue de <code>convert('L')<\/code> sans sp\u00e9cifier de colormap, Matplotlib se trouve face \u00e0 un champ scalaire pur sans instruction de restitution. Par fid\u00e9lit\u00e9 \u00e0 son contrat d&rsquo;interface g\u00e9n\u00e9rique, il applique automatiquement <code>'viridis'<\/code>. Le tableau de donn\u00e9es d&rsquo;origine, pourtant con\u00e7u pour repr\u00e9senter des niveaux d&rsquo;intensit\u00e9 de gris, est alors transcod\u00e9 \u00e0 l&rsquo;affichage en une topographie thermique artificielle : les valeurs d&rsquo;intensit\u00e9 les plus faibles (les zones sombres) deviennent pourpres, les intensit\u00e9s m\u00e9dianes prennent une teinte \u00e9meraude, et les intensit\u00e9s les plus \u00e9clatantes culminent dans un jaune vif. Bien que le contenu informatif de la matrice n&rsquo;ait subi aucune alt\u00e9ration, la restitution visuelle finale est radicalement travestie.<\/p>\n<h3>6.2 Distinction critique entre structure matricielle et restitution visuelle<\/h3>\n<p>Ce comportement met en lumi\u00e8re une distinction ontologique fondamentale en science informatique et en traitement de donn\u00e9es : la s\u00e9paration absolue entre le mod\u00e8le structurel de la donn\u00e9e et sa projection ph\u00e9nom\u00e9nologique sur un p\u00e9riph\u00e9rique de sortie. Une matrice NumPy bidimensionnelle n&rsquo;est fondamentalement rien d&rsquo;autre qu&rsquo;un arrangement g\u00e9om\u00e9trique r\u00e9gulier de grandeurs math\u00e9matiques num\u00e9riques dans l&rsquo;espace euclidien discret. Elle ne d\u00e9tient intrins\u00e8quement aucune propri\u00e9t\u00e9 de \u00ab\u00a0couleur\u00a0\u00bb ou de \u00ab\u00a0gris\u00a0\u00bb en dehors de la convention d&rsquo;interpr\u00e9tation qui lui est appliqu\u00e9e.<\/p>\n<p>La table de correspondance colorim\u00e9trique constitue un pont de projection arbitraire reliant l&rsquo;espace des valeurs scalaires math\u00e9matiques \u00e0 l&rsquo;espace physique des \u00e9missions photoniques du moniteur. Le moteur de rast\u00e9risation de Matplotlib op\u00e8re un d\u00e9couplage total entre ces deux domaines. L&rsquo;utilisateur a toute latitude pour mapper une m\u00eame et unique matrice <code>(M, N)<\/code> vers une infinit\u00e9 d&rsquo;espaces visuels : une \u00e9chelle achromatique lin\u00e9aire continue (<code>cmap='gray'<\/code>), une \u00e9chelle thermique divergente (<code>cmap='coolwarm'<\/code>), une cartographie topographique (<code>cmap='terrain'<\/code>), ou m\u00eame une palette cyclique p\u00e9riodique (<code>cmap='hsv'<\/code>).<\/p>\n<p>Dans le cadre d&rsquo;une d\u00e9marche scientifique rigoureuse, il incombe donc au chercheur d&rsquo;exercer un contr\u00f4le total et explicite sur chaque segment de ce pipeline de projection. D\u00e9laisser les param\u00e8tres de rendu au profit des comportements par d\u00e9faut de l&rsquo;interpr\u00e9teur logiciel introduit une ambigu\u00eft\u00e9 m\u00e9thodologique majeure. La d\u00e9claration syst\u00e9matique de l&rsquo;argument <code>cmap='gray'<\/code> ne constitue pas une simple redondance syntaxique, mais l&rsquo;affirmation programmatique explicite de la convention de lecture photom\u00e9trique assign\u00e9e \u00e0 la matrice d&rsquo;intensit\u00e9.<\/p>\n<h3>6.3 Impacts psycho-visuels d&rsquo;une fausse colorisation dans les protocoles d&rsquo;exp\u00e9rimentation<\/h3>\n<p>Dans le contexte sp\u00e9cifique de la recherche exp\u00e9rimentale en psychophysique et en neurosciences, l&rsquo;introduction involontaire d&rsquo;une colormap en fausses couleurs sur un stimulus monochrome induit des perturbations massives susceptibles de fausser int\u00e9gralement les donn\u00e9es empiriques recueillies. La premi\u00e8re alt\u00e9ration concerne l&rsquo;introduction de fronti\u00e8res perceptives totalement illusoires. M\u00eame une palette optimis\u00e9e comme <code>'viridis'<\/code>, bien que lin\u00e9aris\u00e9e en luminance globale, pr\u00e9sente des transitions chromatiques qualitatives marqu\u00e9es (comme le basculement du bleu-violet vers le vert).<\/p>\n<p>Ces transitions chromatiques brutales sont trait\u00e9es de mani\u00e8re pr\u00e9-attentionnelle par les voies visuelles parvocellulaires et koniocellulaires des observateurs humains, d\u00e9clenchant des illusions de segmentation de figures (<em>figure-ground segregation<\/em>) qui n&rsquo;existent aucunement dans les gradients de texture originaux du stimulus scalaire. Un sujet humain soumis \u00e0 une t\u00e2che de discrimination de formes ou de d\u00e9tection de textures complexes verra son regard capt\u00e9 par les bandes de couleur artificielle, d\u00e9gradant la fid\u00e9lit\u00e9 de ses temps de r\u00e9action et introduisant des motifs d&rsquo;exploration oculom\u00e9trique artificiels.<\/p>\n<p>Sur le plan d\u00e9ontologique et de l&rsquo;int\u00e9grit\u00e9 scientifique, la publication de figures scientifiques utilisant des fausses couleurs non d\u00e9clar\u00e9es pour repr\u00e9senter des donn\u00e9es d&rsquo;intensit\u00e9 pure viole les principes fondamentaux de reproductibilit\u00e9 et de fid\u00e9lit\u00e9 visuelle. Elle complique inutilement la lecture des trac\u00e9s par les pairs et peut masquer ou exacerber artificiellement des artefacts de bruit spatial au sein des capteurs d&rsquo;imagerie. La ma\u00eetrise absolue de l&rsquo;attribution des colormaps scalaires achromatiques constitue ainsi un pr\u00e9requis non n\u00e9gociable pour quiconque pr\u00e9tend concevoir des protocoles exp\u00e9rimentaux solides ou publier dans des revues acad\u00e9miques de premier rang.<\/p>\n<h2>7. M\u00e9thodes alternatives de conversion en niveaux de gris sous Python<\/h2>\n<h3>7.1 Conversion manuelle via alg\u00e8bre lin\u00e9aire avec NumPy<\/h3>\n<p>Bien que l&rsquo;utilisation du mode <code>convert('L')<\/code> de Pillow soit hautement recommand\u00e9e pour sa commodit\u00e9 et son optimisation algorithmique native en C, il est tout \u00e0 fait possible \u2014 et parfois conceptuellement pr\u00e9f\u00e9rable \u2014 d&rsquo;op\u00e9rer la conversion en niveaux de gris de mani\u00e8re strictement autonome au moyen des op\u00e9rateurs d&rsquo;alg\u00e8bre lin\u00e9aire de NumPy. Cette approche manuelle offre au chercheur une transparence math\u00e9matique absolue et un contr\u00f4le algorithmique total sur les constantes de pond\u00e9ration photom\u00e9trique appliqu\u00e9es.<\/p>\n<p>Pour accomplir cette op\u00e9ration vectoris\u00e9e sur un tableau NumPy trichrome <code>rgb_array<\/code> de forme <code>(H, W, 3)<\/code>, on applique un produit contract\u00e9 (produit scalaire) le long du troisi\u00e8me axe dimensionnel avec un vecteur unitaire contenant les pond\u00e9rations normalis\u00e9es. Consid\u00e9rons la formule vectorielle impl\u00e9ment\u00e9e comme suit :<\/p>\n<p>On d\u00e9finit d&rsquo;abord le vecteur de pond\u00e9ration selon les normes ITU-R BT.601 ou plus modernes : <code>weights = np.array([0.299, 0.587, 0.114])<\/code>. La r\u00e9duction dimensionnelle s&rsquo;effectue ensuite \u00e9l\u00e9gamment par l&rsquo;interm\u00e9diaire de la m\u00e9thode de produit scalaire : <code>gray_manual = np.dot(rgb_array[..., :3], weights)<\/code>. L&rsquo;utilisation de l&rsquo;ellipse de d\u00e9coupage syntaxique <code>...<\/code> combin\u00e9e \u00e0 la s\u00e9lection <code>:3<\/code> garantit que si l&rsquo;image comporte un quatri\u00e8me canal alpha accessoire, celui-ci est d\u00e9lib\u00e9r\u00e9ment ignor\u00e9 lors du calcul du produit matriciel.<\/p>\n<p>Cette approche d&rsquo;alg\u00e8bre matricielle pure \u00e9limine toute d\u00e9pendance externe envers la biblioth\u00e8que Pillow au sein des pipelines de calcul intensif. Elle s&rsquo;av\u00e8re particuli\u00e8rement puissante lorsqu&rsquo;il s&rsquo;agit d&rsquo;exp\u00e9rimenter des normes photom\u00e9triques alternatives \u2014 par exemple la norme plus r\u00e9cente <a rel=\"noopener noreferrer\" href=\"https:\/\/www.itu.int\/rec\/R-REC-BT.709\">ITU-R BT.709<\/a> employ\u00e9e dans la vid\u00e9o haute d\u00e9finition moderne, dont les coefficients d&rsquo;excitation spectrale s&rsquo;\u00e9tablissent \u00e0 0.2126 pour le rouge, 0.7152 pour le vert et 0.0722 pour le bleu, refl\u00e9tant la colorim\u00e9trie des moniteurs contemporains \u00e0 large gamme spectrale.<\/p>\n<h3>7.2 Utilisation de scikit-image (rgb2gray) et normalisation flottante<\/h3>\n<p>Une autre alternative d&rsquo;excellence au sein de l&rsquo;\u00e9cosyst\u00e8me Python scientifique r\u00e9side dans l&rsquo;utilisation de la biblioth\u00e8que de r\u00e9f\u00e9rence d\u00e9di\u00e9e au traitement d&rsquo;images : <a rel=\"noopener noreferrer\" href=\"https:\/\/scikit-image.org\/\">scikit-image<\/a> (souvent abr\u00e9g\u00e9e <code>skimage<\/code>). Con\u00e7ue d\u00e8s l&rsquo;origine pour s&rsquo;interfacer de fa\u00e7on symbiotique avec les tableaux NumPy et l&rsquo;\u00e9cosyst\u00e8me SciPy, <code>skimage<\/code> propose le module sp\u00e9cialis\u00e9 <code>skimage.color<\/code>, au sein duquel figure la fonction <code>rgb2gray()<\/code>.<\/p>\n<p>L&rsquo;utilisation de cette fonction se distingue par une divergence conceptuelle capitale par rapport aux m\u00e9thodes de Pillow : la mutation syst\u00e9matique du type de donn\u00e9es et de l&rsquo;intervalle de quantification dynamique. Lorsque l&rsquo;on soumet un tableau <code>numpy.uint8<\/code> de valeurs discr\u00e8tes comprises entre 0 et 255 \u00e0 l&rsquo;instruction <code>gray_float = rgb2gray(rgb_array)<\/code>, scikit-image ne renvoie pas un tableau d&rsquo;entiers. Elle convertit instantan\u00e9ment la matrice vers le type \u00e0 pr\u00e9cision en virgule flottante double <code>numpy.float64<\/code>, tout en op\u00e9rant une normalisation affine stricte born\u00e9e sur l&rsquo;intervalle r\u00e9el continu <span class=\"arabpsy-math-inline\" data-latex=\"[0.0, 1.0]\">$[0.0, 1.0]$<\/span>.<\/p>\n<p>Ce basculement vers le domaine flottant procure des avantages analytiques majeurs pour les calculs de gradients fins, d&rsquo;\u00e9quations diff\u00e9rentielles partielles de diffusion anisotrope ou d&rsquo;analyses spectrales d&rsquo;ondelettes, en pr\u00e9venant les erreurs d&rsquo;arrondi et les artefacts de quantification (<em>banding<\/em>) inh\u00e9rents \u00e0 l&rsquo;arithm\u00e9tique enti\u00e8re sur 8 bits. Cependant, cette conversion impose une vigilance accrue lors du rendu avec Matplotlib : comme nous l&rsquo;avons pr\u00e9cis\u00e9, <code>plt.imshow(gray_float, cmap='gray')<\/code> s&rsquo;attendra d\u00e9sormais \u00e0 des valeurs contenues entre 0.0 et 1.0. Toute op\u00e9ration math\u00e9matique interm\u00e9diaire qui repousserait les valeurs maximales au-del\u00e0 de 1.0 imposerait un re-calibrage manuel strict des param\u00e8tres de saturation.<\/p>\n<h3>7.3 Approche avec OpenCV (cv2.cvtColor et cv2.COLOR_BGR2GRAY)<\/h3>\n<p>Dans les applications industrielles de vision artificielle, d&rsquo;analyse vid\u00e9o en temps r\u00e9el ou de traitement robotique de flux de cam\u00e9ras, la biblioth\u00e8que <a rel=\"noopener noreferrer\" href=\"https:\/\/opencv.org\/\">OpenCV<\/a> (interfac\u00e9e sous le module <code>cv2<\/code> en Python) demeure le moteur le plus v\u00e9loce, gr\u00e2ce \u00e0 ses routines massivement parall\u00e9lis\u00e9es \u00e9crites en C\/C++ et optimis\u00e9es pour les architectures mat\u00e9rielles SIMD (SSE, AVX, NEON). La conversion vers l&rsquo;\u00e9chelle de gris s&rsquo;effectue sous OpenCV par l&rsquo;interm\u00e9diaire de la m\u00e9thode <code>cv2.cvtColor()<\/code>, combin\u00e9e au drapeau algorithmique <code>cv2.COLOR_BGR2GRAY<\/code>.<\/p>\n<p>Cependant, l&rsquo;int\u00e9gration conjointe d&rsquo;OpenCV et de Matplotlib rec\u00e8le un pi\u00e8ge topologique c\u00e9l\u00e8bre li\u00e9 \u00e0 l&rsquo;ordre des canaux spectraux. Par h\u00e9ritage de choix historiques datant des premi\u00e8res cartes de num\u00e9risation vid\u00e9o analogiques, OpenCV ne charge pas les images matricielles selon la s\u00e9quence standard rouge, vert, bleu (RGB), mais selon la s\u00e9quence invers\u00e9e bleu, vert, rouge (BGR). Par cons\u00e9quent, si l&rsquo;on applique directement des transformations de luminance sans tenir compte de cette inversion, les pond\u00e9rations photom\u00e9triques sont perverties : les coefficients du rouge et du bleu se trouvent malencontreusement permut\u00e9s.<\/p>\n<p>D\u00e8s lors, deux voies d&rsquo;interfa\u00e7age s&rsquo;offrent au praticien :<\/p>\n<ul>\n<li>Soit proc\u00e9der \u00e0 la conversion en niveaux de gris directement au sein d&rsquo;OpenCV en informant le moteur de l&rsquo;agencement BGR natif : <code>gray_cv2 = cv2.cvtColor(bgr_image, cv2.COLOR_BGR2GRAY)<\/code>. OpenCV appliquera alors la pond\u00e9ration BT.601 correcte en prenant soin d&rsquo;associer le coefficient 0.114 au premier canal (bleu) et 0.299 au troisi\u00e8me (rouge). La matrice r\u00e9sultante <code>(H, W)<\/code> pourra ensuite \u00eatre imm\u00e9diatement visualis\u00e9e dans Matplotlib via <code>plt.imshow(gray_cv2, cmap='gray')<\/code>.<\/li>\n<li>Soit r\u00e9tablir au pr\u00e9alable la polarit\u00e9 standard RGB : <code>rgb_image = cv2.cvtColor(bgr_image, cv2.COLOR_BGR2RGB)<\/code>, avant de solliciter les modules de Pillow ou de scikit-image.<\/li>\n<\/ul>\n<p>En termes d&rsquo;efficience computationnelle pure, des analyses comparatives (<em>benchmarks<\/em>) d\u00e9montrent qu&rsquo;OpenCV surpasse Pillow d&rsquo;environ 15 \u00e0 25 % sur des op\u00e9rations de d\u00e9saturation isol\u00e9es, tandis que la solution d&rsquo;alg\u00e8bre matricielle pure via <code>numpy.dot<\/code> s&rsquo;av\u00e8re l\u00e9g\u00e8rement plus lente mais conserve l&rsquo;immense avantage de ne r\u00e9clamer aucune d\u00e9pendance externe lourde en C\/C++.<\/p>\n<h2>8. Ma\u00eetrise avanc\u00e9e des colormaps et normalisation de l&rsquo;intensit\u00e9<\/h2>\n<h3>8.1 Les variantes de l&rsquo;\u00e9chelle de gris dans Matplotlib<\/h3>\n<p>La biblioth\u00e8que Matplotlib ne se cantonne pas \u00e0 la seule table de correspondance <code>'gray'<\/code> conventionnelle ; elle met \u00e0 disposition des chercheurs une collection de palettes monochromatiques sp\u00e9cialis\u00e9es adapt\u00e9es \u00e0 des contraintes m\u00e9thodologiques ou instrumentales pr\u00e9cises. La d\u00e9clinaison la plus couramment sollicit\u00e9e est l&rsquo;\u00e9chelle invers\u00e9e, accessible au moyen du suffixe d&rsquo;inversion syntaxique <code>'gray_r'<\/code> (le <em>r<\/em> signifiant <em>reversed<\/em>). Sous cette modalit\u00e9, la table de projection est rigoureusement invers\u00e9e : la valeur d&rsquo;intensit\u00e9 0 est assign\u00e9e au blanc spectral pur, tandis que la valeur maximale est projet\u00e9e en noir d&rsquo;encre absolu.<\/p>\n<p>Cette inversion photom\u00e9trique s&rsquo;av\u00e8re d&rsquo;une utilit\u00e9 pr\u00e9cieuse dans le domaine des sciences cognitives de la vision, notamment pour \u00e9tudier l&rsquo;effet de n\u00e9gatif photographique dans les paradigmes de reconnaissance de visages ou pour mat\u00e9rialiser des repr\u00e9sentations de micro-densitom\u00e9trie et de microscopie confocale o\u00f9 les structures biologiques d&rsquo;int\u00e9r\u00eat sont conventionnellement document\u00e9es sous forme de d\u00e9p\u00f4ts opaques sur fond clair. D&rsquo;autres variantes d&rsquo;\u00e9chelles achromatiques ou quasi-monochromes enrichissent le sous-syst\u00e8me de visualisation :<\/p>\n<ul>\n<li><strong>&lsquo;binary&rsquo; :<\/strong> Une table strictement bichromatique, couramment exploit\u00e9e pour la visualisation de masques de segmentation bool\u00e9ens ou de matrices de clairvoyance binaire, o\u00f9 chaque pixel est tranch\u00e9 sans gradient interm\u00e9diaire complexe.<\/li>\n<li><strong>&lsquo;bone&rsquo; :<\/strong> Une palette d&rsquo;\u00e9chelle de gris subtilement r\u00e9chauff\u00e9e par l&rsquo;adjonction d&rsquo;une tr\u00e8s faible dominante bleu\u00e2tre dans les zones de basse intensit\u00e9. Cette table imite les n\u00e9gatifs radiographiques conventionnels de l&rsquo;imagerie m\u00e9dicale par rayons X et accro\u00eet la discriminabilit\u00e9 visuelle subjective des micro-fractures squelettiques.<\/li>\n<li><strong>&lsquo;gist_gray&rsquo; :<\/strong> Une variante d\u00e9velopp\u00e9e par les laboratoires nationaux du d\u00e9partement de l&rsquo;\u00c9nergie am\u00e9ricain, offrant une couverture dynamique l\u00e9g\u00e8rement plus agressive dans les transitions entre les ombres profondes et les hautes lumi\u00e8res.<\/li>\n<\/ul>\n<p>Le tableau comparatif suivant synth\u00e9tise les propri\u00e9t\u00e9s et contextes d&rsquo;application de ces principales tables de correspondance monochromatiques disponibles nativement sous Matplotlib :<\/p>\n<table border=\"1\" cellpadding=\"6\" cellspacing=\"0\" style=\"border-collapse: collapse;width: 100%;margin: 15px 0\">\n<thead>\n<tr style=\"background-color: #f2f2f2\">\n<th>Identifiant Matplotlib<\/th>\n<th>Type de Progression<\/th>\n<th>Plage Chromatique Associ\u00e9e<\/th>\n<th>Domaines d&rsquo;Application Pr\u00e9f\u00e9rentiels<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td><code>'gray'<\/code><\/td>\n<td>Lin\u00e9aire continue<\/td>\n<td>Noir absolu [0] vers Blanc pur [255]<\/td>\n<td>Psychophysique standard, vision par ordinateur, imagerie g\u00e9n\u00e9rale.<\/td>\n<\/tr>\n<tr>\n<td><code>'gray_r'<\/code><\/td>\n<td>Lin\u00e9aire invers\u00e9e<\/td>\n<td>Blanc pur [0] vers Noir absolu [255]<\/td>\n<td>\u00c9tude du n\u00e9gatif photographique, microscopie, documentation d&rsquo;encrage.<\/td>\n<\/tr>\n<tr>\n<td><code>'binary'<\/code><\/td>\n<td>Discr\u00e8te ou lin\u00e9aire stricte<\/td>\n<td>Fond blanc opaque vers premier plan noir<\/td>\n<td>Masques binaires, filtrages morphologiques, analyse de graphies.<\/td>\n<\/tr>\n<tr>\n<td><code>'bone'<\/code><\/td>\n<td>Monochrome enrichi<\/td>\n<td>Noir vers cyan tr\u00e8s doux puis blanc<\/td>\n<td>Imagerie m\u00e9dicale, tomodensitom\u00e9trie (CT scan), angiographie.<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<h3>8.2 R\u00e9glage de la dynamique de contraste avec les param\u00e8tres vmin et vmax<\/h3>\n<p>Par d\u00e9faut, le moteur de rast\u00e9risation de <code>plt.imshow()<\/code> applique une normalisation dynamique automatique (d\u00e9nomm\u00e9e <em>autoscale<\/em>) sur l&rsquo;ensemble des donn\u00e9es scalaires qu&rsquo;il re\u00e7oit. Cela signifie que l&rsquo;interpr\u00e9teur parcourt l&rsquo;int\u00e9gralit\u00e9 de la matrice pour en identifier la valeur minimale absolue <span class=\"arabpsy-math-inline\" data-latex=\"x_{\\min}\">$x_{\\min}$<\/span> et la valeur maximale <span class=\"arabpsy-math-inline\" data-latex=\"x_{\\max}\">$x_{\\max}$<\/span>. Il \u00e9tire ensuite lin\u00e9airement cette plage sp\u00e9cifique pour la faire co\u00efncider avec les extr\u00e9mit\u00e9s de la table de correspondance : <span class=\"arabpsy-math-inline\" data-latex=\"x_{\\min}\">$x_{\\min}$<\/span> est forc\u00e9 au noir et <span class=\"arabpsy-math-inline\" data-latex=\"x_{\\max}\">$x_{\\max}$<\/span> est forc\u00e9 au blanc.<\/p>\n<p>Bien que cette disposition soit avantageuse pour examiner rapidement des donn\u00e9es statistiques brutes dont la plage est inconnue, elle repr\u00e9sente un danger m\u00e9thodologique majeur lors de protocoles exp\u00e9rimentaux s\u00e9quentiels. Imaginons un protocole de perception visuelle pr\u00e9sentant successivement deux stimuli : l&rsquo;un faiblement \u00e9clair\u00e9 dont les intensit\u00e9s r\u00e9elles s&rsquo;\u00e9talent de 10 \u00e0 50, et l&rsquo;autre vivement illumin\u00e9 s&rsquo;\u00e9talant de 200 \u00e0 240. Si le chercheur omet de contraindre l&rsquo;\u00e9talonnage, Matplotlib \u00e9tirera le premier stimulus de sorte que l&rsquo;intensit\u00e9 50 devienne un blanc aveuglant, et \u00e9tirera le second de sorte que 200 devienne un noir profond. L&rsquo;observateur humain sera ainsi expos\u00e9 \u00e0 deux sc\u00e8nes de contraste artificiellement maximis\u00e9, annihilant totalement la disparit\u00e9 d&rsquo;illumination physique r\u00e9elle que le protocole visait \u00e0 tester.<\/p>\n<p>Pour neutraliser ce biais et garantir le maintien d&rsquo;une \u00e9chelle absolue de luminance commune \u00e0 travers l&rsquo;ensemble des stimuli d&rsquo;une s\u00e9rie, il est imp\u00e9ratif de verrouiller manuellement les bornes de normalisation au moyen des arguments <code>vmin<\/code> et <code>vmax<\/code>. L&rsquo;instruction prendra alors la forme explicite suivante :<\/p>\n<p><code>plt.imshow(gray_array, cmap='gray', vmin=0, vmax=255)<\/code><\/p>\n<p>En fixant rigoureusement <code>vmin=0<\/code> et <code>vmax=255<\/code> pour des donn\u00e9es au format <code>uint8<\/code> (ou respectivement <code>vmin=0.0<\/code> et <code>vmax=1.0<\/code> pour des donn\u00e9es normalis\u00e9es en virgule flottante), le praticien s&rsquo;assure que la table de projection ne subit aucune distorsion relative adaptative. Les sc\u00e8nes sombres conservent leur distribution spectrale t\u00e9n\u00e9breuse, les sc\u00e8nes claires pr\u00e9servent leur brillance fov\u00e9ale, et l&rsquo;int\u00e9grit\u00e9 m\u00e9trologique de la batterie de stimuli visuels est scrupuleusement pr\u00e9serv\u00e9e.<\/p>\n<h3>8.3 Histogrammes d&rsquo;intensit\u00e9 et \u00e9galisation pour l&rsquo;homog\u00e9n\u00e9isation des stimuli<\/h3>\n<p>Au-del\u00e0 du simple affichage g\u00e9om\u00e9trique de la matrice d&rsquo;image, la caract\u00e9risation statistique fine de la distribution des intensit\u00e9s monochromatiques constitue une exigence fondamentale en vision computationnelle. Cette caract\u00e9risation s&rsquo;op\u00e8re par le tra\u00e7age et l&rsquo;analyse de l&rsquo;histogramme des niveaux de gris. L&rsquo;histogramme quantifie la densit\u00e9 de probabilit\u00e9 empirique d&rsquo;apparition de chaque niveau d&rsquo;\u00e9clairement au sein de la matrice. Matplotlib permet de g\u00e9n\u00e9rer ce diagnostic au moyen de la m\u00e9thode de distribution <code>matplotlib.pyplot.hist()<\/code>, appliqu\u00e9e \u00e0 la matrice aplatie en un vecteur unidimensionnel au moyen de la m\u00e9thode <code>ravel()<\/code> :<\/p>\n<p><code>plt.hist(gray_array.ravel(), bins=256, range=[0, 256], color='black', alpha=0.7)<\/code><\/p>\n<p>L&rsquo;observation de cette distribution empirique permet de r\u00e9v\u00e9ler des d\u00e9s\u00e9quilibres photom\u00e9triques chroniques au sein des bases de stimuli photographiques : regroupement excessif des fr\u00e9quences dans les basses intensit\u00e9s (sous-exposition), saturation massive au niveau de la valeur 255 (surexposition ou <em>clipping<\/em>), ou encore confinement du signal dans un intervalle \u00e9troit (faible contraste spatial global). Dans les protocoles \u00e9valuant la vitesse de cat\u00e9gorisation visuelle ou la m\u00e9moire de reconnaissance, ces d\u00e9s\u00e9quilibres constituent des facteurs de confusion majeurs.<\/p>\n<p>Pour rem\u00e9dier \u00e0 cette variabilit\u00e9 non contr\u00f4l\u00e9e, les chercheurs appliquent fr\u00e9quemment des algorithmes d&rsquo;\u00e9galisation d&rsquo;histogramme (<em>histogram equalization<\/em>), disponibles notamment au sein du module <code>skimage.exposure.equalize_hist<\/code>. L&rsquo;\u00e9galisation applique une fonction de transformation non lin\u00e9aire monotone \u2014 fond\u00e9e sur la fonction de distribution cumulative empirique des pixels \u2014 qui r\u00e9alloue uniform\u00e9ment les intensit\u00e9s scalaires sur l&rsquo;ensemble de la plage dynamique disponible. Le contraste spatial global du stimulus est ainsi math\u00e9matiquement maximis\u00e9, garantissant que chaque niveau d&rsquo;intensit\u00e9 transporte une quantit\u00e9 \u00e9quivalente d&rsquo;information au sens de la th\u00e9orie de Shannon et neutralisant l&rsquo;avantage perceptif involontaire dont pourraient b\u00e9n\u00e9ficier certains stimuli naturels plus contrast\u00e9s que d&rsquo;autres.<\/p>\n<h2>9. Applications en psychophysique et perception visuelle<\/h2>\n<h3>9.1 Contr\u00f4le rigoureux de la luminance et suppression des biais chromatiques<\/h3>\n<p>La recherche contemporaine en psychophysique de la vision humaine s&rsquo;appuie sur une isolation m\u00e9thodologique scrupuleuse des diff\u00e9rents sous-syst\u00e8mes sensoriels composant le traitement de l&rsquo;information r\u00e9tinotopique. L&rsquo;un des postulats directeurs de cette discipline r\u00e9side dans la s\u00e9paration fonctionnelle pr\u00e9coce entre la d\u00e9tection spatio-temporelle de la forme et du mouvement (majoritairement prise en charge par le syst\u00e8me magnocellulaire achromatique) et le d\u00e9codage fin de la couleur et de la texture de surface (d\u00e9volu au syst\u00e8me parvocellulaire). D\u00e8s lors, le recours \u00e0 des stimuli rigoureusement calibr\u00e9s en niveaux de gris s&rsquo;impose pour quiconque souhaite \u00e9tudier la cin\u00e9matique visuelle ou l&rsquo;int\u00e9gration morphologique sans contamination chromatique.<\/p>\n<p>Au-del\u00e0 de la modularit\u00e9 anatomique des voies visuelles, la suppression des composantes spectrales permet de d\u00e9sactiver les r\u00e9ponses \u00e9motionnelles diff\u00e9rentielles involontaires induites par certaines longueurs d&rsquo;onde sp\u00e9cifiques. La litt\u00e9rature exp\u00e9rimentale a amplement document\u00e9 le fait que les tonalit\u00e9s de rouge satur\u00e9 provoquent chez l&rsquo;humain des \u00e9l\u00e9vations transitoires de l&rsquo;\u00e9veil physiologique (<em>arousal<\/em>), modulant la conductance cutan\u00e9e \u00e9lectrodermale, la fr\u00e9quence cardiaque et raccourcissant artificiellement les temps de r\u00e9action de d\u00e9tection dans des t\u00e2ches de discrimination simple. Convertir une base d&rsquo;images en niveaux de gris permet d&rsquo;annihiler ces interf\u00e9rences affectives incidentes et d&rsquo;\u00e9valuer la r\u00e9ponse cognitive \u00e0 la seule structure g\u00e9om\u00e9trique du stimulus.<\/p>\n<p>Un autre d\u00e9fi r\u00e9side dans les paradigmes exp\u00e9rimentaux de masquage visuel r\u00e9troactif (<em>backward masking<\/em>) ou de rivalit\u00e9 binoculaire. Dans ces protocoles, un stimulus cible doit \u00eatre dissimul\u00e9 ou mis en comp\u00e9tition perceptive avec un stimulus masque affich\u00e9 quelques dizaines de millisecondes plus tard. Si la cible et le masque pr\u00e9sentent des disparit\u00e9s de luminance globale moyenne, le syst\u00e8me visuel pr\u00e9coce int\u00e8gre ces \u00e9carts d&rsquo;\u00e9nergie lumineuse globale plut\u00f4t que les rapports de forme, g\u00e9n\u00e9rant des artefacts de persistance r\u00e9tinienne. L&rsquo;ajustement syst\u00e9matique de matrices d&rsquo;intensit\u00e9 2D dans Matplotlib, coupl\u00e9 \u00e0 un \u00e9talonnage rigoureux de leur contraste photom\u00e9trique, permet d&rsquo;harmoniser parfaitement l&rsquo;\u00e9nergie de stimulation d\u00e9livr\u00e9e \u00e0 l&rsquo;\u0153il du sujet.<\/p>\n<h3>9.2 Sensibilit\u00e9 au contraste spatial et motifs de r\u00e9seaux de Gabor<\/h3>\n<p>Dans l&rsquo;arsenal m\u00e9thodologique de l&rsquo;\u00e9valuation sensorielle de la vision humaine, les patchs ou r\u00e9seaux de Gabor constituent les stimuli \u00e9talons par excellence. Un r\u00e9seau de Gabor est une fonction math\u00e9matique bidimensionnelle combinant une onde sinuso\u00efdale d&rsquo;illumination spatiale (qui d\u00e9termine la fr\u00e9quence spatiale et l&rsquo;orientation g\u00e9om\u00e9trique du motif) modul\u00e9e par une enveloppe gaussienne bidimensionnelle d&rsquo;att\u00e9nuation radiale (qui confine le stimulus dans une fen\u00eatre spatiale born\u00e9e). Ces motifs sont g\u00e9n\u00e9r\u00e9s de fa\u00e7on purement synth\u00e9tique en Python au moyen de formulations matricielles NumPy denses avant d&rsquo;\u00eatre visualis\u00e9s avec Matplotlib.<\/p>\n<p>L&rsquo;int\u00e9r\u00eat neurobiologique majeur des r\u00e9seaux de Gabor r\u00e9side dans leur \u00e9quivalence formelle avec la fonction de transfert spatio-fr\u00e9quentielle des champs r\u00e9cepteurs des neurones simples d\u00e9couverts par David Hubel et Torsten Wiesel au sein du cortex visuel primaire (aire V1). Ces cellules corticales agissent v\u00e9ritablement comme des analyseurs d&rsquo;ondes locales accord\u00e9s sur des bandes \u00e9troites de fr\u00e9quences spatiales (exprim\u00e9es en cycles par degr\u00e9 d&rsquo;angle visuel) et des orientations sp\u00e9cifiques dans l&rsquo;espace r\u00e9tinien. Pour mesurer la fonction de sensibilit\u00e9 au contraste spatial (<em>Contrast Sensitivity Function<\/em> ou CSF) chez un observateur, les chercheurs ajustent finement l&rsquo;amplitude scalaire de la sinuso\u00efde du r\u00e9seau de Gabor en niveaux de gris.<\/p>\n<p>Le pilotage d&rsquo;un tel protocole requiert une exactitude irr\u00e9prochable au sein du moteur d&rsquo;affichage. Les matrices 2D mod\u00e9lisant les r\u00e9seaux de Gabor doivent \u00eatre converties en repr\u00e9sentations flottantes, puis projet\u00e9es \u00e0 travers <code>imshow()<\/code> en fixant imp\u00e9rativement <code>cmap='gray'<\/code>, avec un verrouillage sym\u00e9trique des contrastes via <code>vmin=-1.0<\/code> et <code>vmax=1.0<\/code> (ou \u00e9quivalent normalis\u00e9). La moindre alt\u00e9ration g\u00e9om\u00e9trique introduite par une interpolation inad\u00e9quate ou la moindre d\u00e9rive chromatique introduite par une colormap inappropri\u00e9e d\u00e9naturerait la puret\u00e9 spectrale du stimulus sinuso\u00efdal, ruinant la validit\u00e9 \u00e9cologique des mesures de seuils de perception psychophysiques.<\/p>\n<h3>9.3 Mesure des temps de r\u00e9action et perception des visages (Face Processing)<\/h3>\n<p>L&rsquo;\u00e9tude des processus cognitifs sous-tendant la reconnaissance des visages humains (<em>face processing<\/em>) constitue un domaine d&rsquo;investigation o\u00f9 la standardisation rigoureuse des matrices en niveaux de gris a permis des perc\u00e9es th\u00e9oriques capitales. Des banques de visages mondialement reconnues et partag\u00e9es par la communaut\u00e9 scientifique \u2014 telles que la base NimStim ou le Karolinska Directed Emotional Faces (KDEF) \u2014 font syst\u00e9matiquement l&rsquo;objet de pr\u00e9-traitements drastiques visant \u00e0 \u00e9liminer les signaux parasites. Dans ces cohortes photographiques, la pigmentation cutan\u00e9e, le bronzage ou la teinte de l&rsquo;iris constituent des indices superficiels que le chercheur doit neutraliser pour contraindre le sujet \u00e0 mobiliser uniquement le traitement holistique ou structural de la configuration faciale.<\/p>\n<p>Un ph\u00e9nom\u00e8ne classique et fascinant dans ce champ de recherche est l&rsquo;effet de n\u00e9gatif photographique de la luminance. Lorsqu&rsquo;un visage humain est pr\u00e9sent\u00e9 sous une forme invers\u00e9e en niveaux de gris \u2014 obtenue instantan\u00e9ment dans Matplotlib en basculant de <code>cmap='gray'<\/code> \u00e0 <code>cmap='gray_r'<\/code> \u2014, les performances de reconnaissance par des sujets humains s&rsquo;effondrent de mani\u00e8re spectaculaire, atteignant des taux d&rsquo;erreur comparables \u00e0 ceux observ\u00e9s lors de l&rsquo;effet classique d&rsquo;inversion g\u00e9om\u00e9trique de l&rsquo;orientation spatiale du visage (<em>face inversion effect<\/em>). \u00c9trangement, cette d\u00e9gradation dramatique de la reconnaissance ne s&rsquo;observe pas pour des objets artificiels ou des paysages naturels.<\/p>\n<p>Ce ph\u00e9nom\u00e8ne s&rsquo;explique par le fait que le syst\u00e8me sp\u00e9cialis\u00e9 de traitement facial, localis\u00e9 dans l&rsquo;aire fusiforme des visages (FFA), d\u00e9pend de fa\u00e7on critique des relations ordinales de luminance dict\u00e9es par l&rsquo;illumination naturelle z\u00e9nithale de notre environnement (le soleil ou les plafonniers illuminant de haut en bas). Dans un visage normal en niveaux de gris, la r\u00e9gion des yeux et la zone sous-nasale apparaissent toujours plus sombres que le front et les pommettes. L&rsquo;inversion par <code>cmap='gray_r'<\/code> inverse ces relations ordinales de contraste, rendant les zones orbitaires anormalement \u00e9clatantes et d\u00e9samor\u00e7ant instantan\u00e9ment les heuristiques de reconnaissance faciale pr\u00e9-c\u00e2bl\u00e9es du syst\u00e8me cognitif.<\/p>\n<h2>10. Bonnes pratiques pour l&rsquo;int\u00e9gration et la publication scientifique<\/h2>\n<h3>10.1 Suppression des artefacts p\u00e9riph\u00e9riques : axes, graduations et bordures<\/h3>\n<p>Lorsqu&rsquo;un chercheur g\u00e9n\u00e8re une visualisation matricielle destin\u00e9e \u00e0 servir de mat\u00e9riel exp\u00e9rimental dans un logiciel de passation chronom\u00e9trique (tel que PsychoPy ou OpenSesame), ou lorsqu&rsquo;il \u00e9labore une figure d&rsquo;illustration pour un manuscrit soumis \u00e0 une revue scientifique \u00e0 comit\u00e9 de lecture, la pr\u00e9sence des \u00e9l\u00e9ments de rep\u00e9rage cart\u00e9sien p\u00e9riph\u00e9riques de Matplotlib constitue un artefact ind\u00e9sirable. Par d\u00e9faut, <code>plt.imshow()<\/code> ins\u00e8re l&rsquo;image au centre d&rsquo;un graphique conventionnel dot\u00e9 d&rsquo;une bordure rectangulaire noire (le cadre de l&rsquo;axe), flanqu\u00e9e de graduations num\u00e9riques (<em>ticks<\/em>) et de labels quantifiant les coordonn\u00e9es des indices de pixels.<\/p>\n<p>Ces \u00e9l\u00e9ments p\u00e9riph\u00e9riques non pertinents alt\u00e8rent le protocole : les graduations blanches et noires introduisent des signaux parasites de contraste spatial \u00e9lev\u00e9 sur la p\u00e9riph\u00e9rie r\u00e9tinienne du sujet, et les marges blanches asym\u00e9triques faussent le centrage g\u00e9om\u00e9trique pr\u00e9cis du stimulus par rapport au point de fixation fov\u00e9al. Pour \u00e9radiquer ces artefacts, il est n\u00e9cessaire d&rsquo;appliquer une s\u00e9quence de purification sc\u00e9nographique stricte :<\/p>\n<ul>\n<li>D\u00e9sactivation int\u00e9grale des rep\u00e8res et bordures de l&rsquo;axe actif : <code>plt.axis('off')<\/code>. Cette directive supprime instantan\u00e9ment le cadre, les coches m\u00e9triques et les annotations num\u00e9riques.<\/li>\n<li>Neutralisation des marges internes du conteneur de la figure : <code>fig.subplots_adjust(left=0, right=1, bottom=0, top=1)<\/code>, garantissant que la matrice d&rsquo;image occupe 100 % de la surface spatiale de la vue graphique sans padding superflu.<\/li>\n<li>Configuration de la bo\u00eete englobante lors de l&rsquo;appel d&rsquo;\u00e9criture disque : <code>plt.savefig('output.png', bbox_inches='tight', pad_inches=0)<\/code>. Cette clause ordonne au moteur de rast\u00e9risation de rogner impitoyablement tout espace blanc r\u00e9siduel entourant les limites g\u00e9om\u00e9triques pures de la matrice.<\/li>\n<\/ul>\n<p>L&rsquo;application rigoureuse de ces instructions produit une image brute purifi\u00e9e, parfaitement centr\u00e9e et rigoureusement d\u00e9pourvue d&rsquo;\u00e9l\u00e9ments graphiques accessoires, r\u00e9pondant aux standards les plus exigeants de la psychom\u00e9trie exp\u00e9rimentale.<\/p>\n<h3>10.2 Gestion de l&rsquo;interpolation spatiale lors du redimensionnement d&rsquo;affichage<\/h3>\n<p>Une dimension technique souvent m\u00e9connue du fonctionnement de <code>plt.imshow()<\/code> concerne la gestion de l&rsquo;interpolation spatiale. D\u00e8s lors que la r\u00e9solution matricielle de l&rsquo;image source ne correspond pas exactement, au pixel pr\u00e8s, \u00e0 la r\u00e9solution de la zone d&rsquo;affichage allou\u00e9e \u00e0 l&rsquo;\u00e9cran (ou \u00e0 la grille de points de l&rsquo;impression papier), le moteur de Matplotlib doit obligatoirement op\u00e9rer un r\u00e9-\u00e9chantillonnage g\u00e9om\u00e9trique de la matrice d&rsquo;intensit\u00e9. Ce calcul est gouvern\u00e9 par le param\u00e8tre explicite <code>interpolation<\/code>.<\/p>\n<p>Par d\u00e9faut, Matplotlib applique un algorithme d&rsquo;interpolation doux (souvent <code>'antialiased'<\/code> ou <code>'bilinear'<\/code>). Dans ce mode, chaque pixel d&rsquo;affichage est le r\u00e9sultat d&rsquo;une moyenne pond\u00e9r\u00e9e continue des pixels matriciels adjacents de l&rsquo;image source. Si cette approche offre un rendu esth\u00e9tiquement agr\u00e9able pour des photographies naturelles en lissant les marches d&rsquo;escalier g\u00e9om\u00e9triques, elle s&rsquo;av\u00e8re hautement pr\u00e9judiciable lorsque le chercheur \u00e9tudie des images de textures fines, des motifs \u00e0 haute fr\u00e9quence spatiale ou des stimuli \u00e0 damiers discrets. L&rsquo;anticr\u00e9nelage \u00e9mousse artificiellement les transitions nettes, introduisant des d\u00e9grad\u00e9s de luminance interm\u00e9diaire inexistants dans la matrice de donn\u00e9es.<\/p>\n<p>Dans les contextes o\u00f9 l&rsquo;int\u00e9grit\u00e9 discr\u00e8te de chaque cellule de pixel originelle doit \u00eatre scrupuleusement pr\u00e9serv\u00e9e \u2014 par exemple lors de l&rsquo;affichage de stimuli de tr\u00e8s basse r\u00e9solution agrandis pour des tests de vision fov\u00e9ale versus p\u00e9riph\u00e9rique \u2014, il est formellement requis de forcer le mode d&rsquo;interpolation au plus proche voisin :<\/p>\n<p><code>plt.imshow(gray_array, cmap='gray', interpolation='nearest')<\/code><\/p>\n<p>Ce param\u00e9trage garantit que chaque point matriciel est reproduit sous la forme d&rsquo;un bloc homog\u00e8ne d&rsquo;intensit\u00e9 constante, sans le moindre filtrage passe-bas spatial ou flou gaussien incident. Pour les photographies continues \u00e0 haute r\u00e9solution o\u00f9 un lissage naturel des artefacts d&rsquo;agrandissement est au contraire recherch\u00e9, le recours aux modes d&rsquo;interpolation d&rsquo;ordre sup\u00e9rieur tels que <code>interpolation='bicubic'<\/code> ou <code>interpolation='lanczos'<\/code> demeure le choix privil\u00e9gi\u00e9 pour pr\u00e9server la fid\u00e9lit\u00e9 des courbures et des textures complexes.<\/p>\n<h3>10.3 Exportation en haute r\u00e9solution vectorielle et matricielle<\/h3>\n<p>La finalisation de visualisations en niveaux de gris destin\u00e9es aux publications scientifiques au sein de revues internationales \u00e0 fort facteur d&rsquo;impact (par exemple \u00e9dit\u00e9es par Elsevier, Springer, Nature Publishing Group ou l&rsquo;American Psychological Association) impose une conformit\u00e9 rigoureuse avec des crit\u00e8res \u00e9ditoriaux drastiques en mati\u00e8re de r\u00e9solution spatiale et de formats de compression. L&rsquo;invocation informelle de la commande <code>plt.savefig('figure.png')<\/code> sans param\u00e9trage approfondi produit le plus souvent un fichier d&rsquo;une r\u00e9solution par d\u00e9faut de 100 DPI (points par pouce), ce qui est manifestement insuffisant pour l&rsquo;impression typographique professionnelle.<\/p>\n<p>Les recommandations typographiques acad\u00e9miques exigent g\u00e9n\u00e9ralement une r\u00e9solution spatiale minimale de 300 DPI pour les photographies continues en demi-teintes ou en niveaux de gris, et fr\u00e9quemment jusqu&rsquo;\u00e0 600 ou 1200 DPI pour les sch\u00e9mas mixtes associant des matrices d&rsquo;images et des trac\u00e9s vectoriels annot\u00e9s. Cette exigence est satisfaite dans Matplotlib par le calibrage du param\u00e8tre <code>dpi<\/code> :<\/p>\n<p><code>plt.savefig('figure_haute_resolution.png', dpi=300, format='png')<\/code><\/p>\n<p>Le choix du format de fichier d&rsquo;exportation doit faire l&rsquo;objet d&rsquo;un arbitrage \u00e9clair\u00e9 :<\/p>\n<ul>\n<li><strong>PNG (Portable Network Graphics) :<\/strong> Format matriciel compress\u00e9 sans perte d&rsquo;information (<em>lossless<\/em>). C&rsquo;est le standard de choix pour l&rsquo;imagerie exp\u00e9rimentale, car il garantit que les valeurs num\u00e9riques d&rsquo;intensit\u00e9 lumineuse des pixels ne subissent aucune d\u00e9gradation irr\u00e9versible li\u00e9e \u00e0 des artefacts de quantification par blocs.<\/li>\n<li><strong>TIFF (Tagged Image File Format) :<\/strong> Format professionnel largement pl\u00e9biscit\u00e9 par les maisons d&rsquo;\u00e9dition scientifique et biom\u00e9dicale. Il permet le stockage de donn\u00e9es sur des profondeurs de bits \u00e9tendues (16 ou 32 bits par canal) et int\u00e8gre des m\u00e9tadonn\u00e9es de calibration spatiale et instrumentale compl\u00e8tes.<\/li>\n<li><strong>PDF \/ EPS (Formats Vectoriels) :<\/strong> Formats privil\u00e9gi\u00e9s pour la soumission d&rsquo;articles. Bien que la matrice d&rsquo;image sous-jacente demeure intrins\u00e8quement rasteris\u00e9e \u00e0 la r\u00e9solution DPI sp\u00e9cifi\u00e9e, les axes, les textes typographiques, les barres d&rsquo;\u00e9chelle et les l\u00e9gendes associ\u00e9es sont conserv\u00e9s sous forme d&rsquo;instructions vectorielles pures, garantissant une nettet\u00e9 de rendu absolue quel que soit le facteur d&rsquo;agrandissement lors de la mise en page finale.<\/li>\n<\/ul>\n<h2>11. D\u00e9pannage et pi\u00e8ges fr\u00e9quents lors de l&rsquo;affichage en niveaux de gris<\/h2>\n<h3>11.1 Erreur classique : Omission simultan\u00e9e de convert(&lsquo;L&rsquo;) et cmap=&rsquo;gray&rsquo;<\/h3>\n<p>L&rsquo;une des sources de confusion les plus chroniques document\u00e9es sur les forums sp\u00e9cialis\u00e9s de la communaut\u00e9 Python r\u00e9side dans les deux \u00e9tats de panne asym\u00e9triques provoqu\u00e9s par l&rsquo;omission conjointe ou disjointe des \u00e9tapes de projection matricielle et de configuration de la colormap. Ces situations d\u00e9routantes se manifestent sous deux cas d&rsquo;\u00e9cole symptomatiques :<\/p>\n<p><strong>Premier sc\u00e9nario pathologique :<\/strong> Le praticien invoque scrupuleusement la table de gris via <code>plt.imshow(image, cmap='gray')<\/code>, mais l&rsquo;image affich\u00e9e demeure r\u00e9solument et impeccablement en couleurs naturelles. Ce diagnostic signale sans \u00e9quivoque que la variable <code>image<\/code> n&rsquo;a pas subi la conversion structurelle pr\u00e9alable et qu&rsquo;elle conserve sa dimensionnalit\u00e9 tridimensionnelle <code>(H, W, 3)<\/code>. Comme nous l&rsquo;avons diss\u00e9qu\u00e9, face \u00e0 trois canaux, le moteur graphique neutralise l&rsquo;argument <code>cmap<\/code> sans avertir l&rsquo;utilisateur et route les flux vers le d\u00e9codeur RGB mat\u00e9riel direct.<\/p>\n<p><strong>Second sc\u00e9nario pathologique :<\/strong> Le praticien a rigoureusement converti son image avec <code>convert('L')<\/code> et dispose d&rsquo;une matrice 2D irr\u00e9prochable de dimensions <code>(H, W)<\/code>, mais \u00e0 l&rsquo;\u00e9cran, le stimulus appara\u00eet dans des teintes criardes jaune fluo, turquoise et violet sombre. Ce diagnostic signale \u00e0 l&rsquo;inverse que l&rsquo;utilisateur a omis d&rsquo;ajouter l&rsquo;argument explicite <code>cmap='gray'<\/code> au sein de <code>imshow()<\/code>. Matplotlib a alors appliqu\u00e9 sa colormap scalaire par d\u00e9faut <code>'viridis'<\/code> sur le tableau d&rsquo;amplitudes bidimensionnel.<\/p>\n<p>La r\u00e8gle d&rsquo;or pour pr\u00e9venir ces \u00e9cueils consiste \u00e0 graver dans sa pratique m\u00e9thodologique le principe de la corr\u00e9lation obligatoire : <em>une matrice 2D pure exige imp\u00e9rativement une table de correspondance monochromatique explicite, et une table de correspondance monochromatique ne peut agir que sur une matrice strictement bidimensionnelle<\/em>. Tout \u00e9cart par rapport \u00e0 ce couplage symbiotique induira in\u00e9vitablement l&rsquo;un de ces deux dysfonctionnements visuels.<\/p>\n<h3>11.2 Incoh\u00e9rences de typage de donn\u00e9es et \u00e9crasement dynamique des \u00e9chelles<\/h3>\n<p>Un deuxi\u00e8me pi\u00e8ge r\u00e9current d\u00e9coule de la manipulation informelle des types de donn\u00e9es scalaires NumPy (<code>dtypes<\/code>) et de leurs conventions de normalisation sous-jacentes. Supposons qu&rsquo;un chercheur applique un traitement de filtrage spatial sur une matrice d&rsquo;image initialement encod\u00e9e en <code>numpy.uint8<\/code>. Les fonctions de filtrage de SciPy ou les calculs de convolution NumPy convertissent souvent implicitement le tableau de sortie vers des r\u00e9els flottants de type <code>numpy.float64<\/code>.<\/p>\n<p>Si ce filtrage math\u00e9matique g\u00e9n\u00e8re des valeurs qui demeurent dans l&rsquo;ordre de grandeur de la plage d&rsquo;origine \u2014 disons des valeurs comprises entre 0.0 et 255.0 \u2014 et que le chercheur transmet directement ce tableau flottant \u00e0 <code>imshow(gray_array, cmap='gray')<\/code>, la visualisation sera int\u00e9gralement d\u00e9truite. Voyant un tableau de type flottant, Matplotlib applique sa convention standard pour les nombres r\u00e9els : il s&rsquo;attend \u00e0 ce que le noir soit cod\u00e9 par 0.0 et le blanc absolu par 1.0. Par cons\u00e9quent, l&rsquo;ensemble des pixels matriciels dont la valeur exc\u00e8de 1.0 \u2014 c&rsquo;est-\u00e0-dire la quasi-totalit\u00e9 de l&rsquo;image \u2014 se retrouvent plafonn\u00e9s et satur\u00e9s (<em>clipped<\/em>) au blanc pur, produisant un rectangle blanc uni au sein duquel la structure du stimulus est totalement annihil\u00e9e.<\/p>\n<p>Pour pr\u00e9venir ou diagnostiquer rapidement ces \u00e9crasements dynamiques d\u00e9vastateurs, il est imp\u00e9ratif d&rsquo;int\u00e9grer des assertions de contr\u00f4le d\u00e9fensif au sein du code de traitement :<\/p>\n<p>On v\u00e9rifiera syst\u00e9matiquement les extremums statistiques au moyen des fonctions vectorielles : <code>print(f\"Type: {array.dtype}, Min: {array.min()}, Max: {array.max()}\")<\/code>. Si le tableau est flottant et s&rsquo;\u00e9tend jusqu&rsquo;\u00e0 255, deux solutions structurelles s&rsquo;imposent : soit normaliser math\u00e9matiquement les donn\u00e9es sur l&rsquo;intervalle unitaire via <code>array_normalized = array \/ 255.0<\/code>, soit forcer explicitement les bornes dynamiques de restitution au sein de l&rsquo;affichage via <code>plt.imshow(array, cmap='gray', vmin=0.0, vmax=255.0)<\/code>.<\/p>\n<h3>11.3 Conservation involontaire du canal de transparence (Alpha)<\/h3>\n<p>Le troisi\u00e8me pi\u00e8ge technique le plus insidieux concerne le traitement accidentel d&rsquo;images num\u00e9riques cod\u00e9es sur 4 canaux, c&rsquo;est-\u00e0-dire sous le format <code>RGBA<\/code>. De nombreux fichiers au format PNG g\u00e9n\u00e9r\u00e9s par des logiciels de design graphique, des syst\u00e8mes d&rsquo;exploitation ou captur\u00e9s depuis des flux web int\u00e8grent une couche alpha pour g\u00e9rer les contours transparents, m\u00eame lorsque l&rsquo;illustration semble visuellement reposer sur un fond enti\u00e8rement blanc uni ou noir uniforme.<\/p>\n<p>Si l&rsquo;op\u00e9rateur tente d&rsquo;extraire la luminance en convertissant superficiellement l&rsquo;image sans purger cette composante de transparence, des anomalies algorithmiques complexes surgissent. Certaines m\u00e9thodes de conversion simplistes projettent les 4 canaux en ignorant la nature math\u00e9matique divergente du canal alpha, conduisant \u00e0 des aberrations o\u00f9 les zones transparentes de la p\u00e9riph\u00e9rie du stimulus sont transcod\u00e9es en noir profond ou en artefacts textur\u00e9s granuleux en fonction des conventions d&rsquo;interpr\u00e9tation de la valeur 0 d&rsquo;opacit\u00e9.<\/p>\n<p>Pour \u00e9liminer d\u00e9finitivement ce risque lors de la manipulation de stimuli visuels rigoureux, la m\u00e9thodologie la plus s\u00fbre consiste \u00e0 op\u00e9rer une fusion de transparence (<em>alpha compositing<\/em>) en amont, convertissant l&rsquo;image vers un fond trichrome neutre et opaque avant toute projection en luminance :<\/p>\n<p>Consid\u00e9rons l&rsquo;algorithme suivant : si l&rsquo;objet image pr\u00e9sente un mode <code>image_pil.mode == 'RGBA'<\/code>, on instancie une nappe de fond monochrome opaque de dimensions identiques au moyen de Pillow : <code>background = Image.new('RGB', image_pil.size, (255, 255, 255))<\/code>. On superpose ensuite l&rsquo;image cible sur ce fond blanc en mobilisant le canal alpha comme masque de fusion g\u00e9om\u00e9trique via la commande : <code>background.paste(image_pil, mask=image_pil.split()[3])<\/code>. Une fois cette op\u00e9ration de synth\u00e8se g\u00e9om\u00e9trique achev\u00e9e, le nouvel objet <code>background<\/code> \u2014 d\u00e9sormais garanti sans composante alpha r\u00e9siduelle \u2014 peut \u00eatre converti sans aucun risque vers le mode <code>'L'<\/code> et projet\u00e9 dans Matplotlib.<\/p>\n<h2>12. Synth\u00e8se et perspectives d&rsquo;extension pour les \u00e9tudes exp\u00e9rimentales<\/h2>\n<h3>12.1 R\u00e9capitulatif du pipeline optimal de pr\u00e9traitement et d&rsquo;affichage<\/h3>\n<p>Au terme de cette exploration th\u00e9orique et pratique approfondie, il convient de cristalliser les meilleures pratiques sous la forme d&rsquo;un pipeline logiciel canonique, standardis\u00e9 et hautement r\u00e9utilisable. Ce gabarit modulaire a pour vocation d&rsquo;\u00eatre encapsul\u00e9 au sein d&rsquo;une fonction d&rsquo;infrastructure scientifique au d\u00e9but de chaque projet de recherche, garantissant une reproductibilit\u00e9 sans faille des conditions de visualisation au sein des carnets de laboratoire interactifs Jupyter Notebooks ou des modules d&rsquo;analyse exp\u00e9rimentale.<\/p>\n<p>Consid\u00e9rons l&rsquo;architecture de cette fonction de r\u00e9f\u00e9rence :<\/p>\n<p>La fonction prend en argument le chemin d&rsquo;acc\u00e8s au fichier ou l&rsquo;objet matriciel source, ainsi qu&rsquo;un bool\u00e9en contr\u00f4lant l&rsquo;affichage imm\u00e9diat. Elle proc\u00e8de s\u00e9quentiellement : 1) \u00e0 l&rsquo;ouverture s\u00e9curis\u00e9e via le gestionnaire de contexte Pillow ; 2) \u00e0 la d\u00e9tection et la fusion d&rsquo;un \u00e9ventuel canal alpha sur fond neutre \u00e9talonn\u00e9 ; 3) \u00e0 la projection photom\u00e9trique en luminance d&rsquo;apr\u00e8s la norme ITU-R BT.601 via l&rsquo;instruction <code>convert('L')<\/code> ; 4) \u00e0 l&rsquo;instanciation de la vue matricielle NumPy bidimensionnelle <code>(H, W)<\/code> ; et enfin 5) au param\u00e9trage rigoureux de l&rsquo;objet <code>AxesImage<\/code> de Matplotlib associant la colormap explicite <code>cmap='gray'<\/code>, l&rsquo;\u00e9talonnage dynamique strict <code>vmin=0, vmax=255<\/code>, le contr\u00f4le de l&rsquo;interpolation spatiale et l&rsquo;extinction des rep\u00e8res d&rsquo;axes p\u00e9riph\u00e9riques.<\/p>\n<p>L&rsquo;adoption syst\u00e9matique d&rsquo;une telle routine logicielle pr\u00e9munit d\u00e9finitivement l&rsquo;\u00e9quipe de recherche contre l&rsquo;apparition de fausses couleurs, \u00e9limine les disparit\u00e9s de contraste non d\u00e9sir\u00e9es \u00e0 travers les sessions de test et garantit que l&rsquo;observateur humain ou l&rsquo;algorithme d&rsquo;apprentissage automatique aval travaille sur un signal scalaire pur, fid\u00e8le \u00e0 la photom\u00e9trie originelle de la sc\u00e8ne d&rsquo;acquisition.<\/p>\n<h3>12.2 Automatisation pour le traitement par lots de banques de stimuli<\/h3>\n<p>Dans la recherche empirique moderne, les protocoles exp\u00e9rimentaux reposent rarement sur la manipulation d&rsquo;une image isol\u00e9e. Ils mobilisent classiquement de volumineuses banques de stimuli comprenant des centaines, voire des milliers d&rsquo;exemplaires photographiques devant faire l&rsquo;objet d&rsquo;une standardisation photom\u00e9trique rigoureuse et uniforme. Dans ce cadre, la mise en place d&rsquo;un pipeline de traitement automatis\u00e9 par lots (<em>batch processing<\/em>) constitue un imp\u00e9ratif d&rsquo;efficacit\u00e9 m\u00e9thodologique.<\/p>\n<p>Ce processus s&rsquo;articule g\u00e9n\u00e9ralement autour de scripts d&rsquo;automatisation exploitant la biblioth\u00e8que standard <code>pathlib<\/code> de Python pour traverser r\u00e9cursivement l&rsquo;arborescence des r\u00e9pertoires de donn\u00e9es brutes. Pour chaque image identifi\u00e9e, le script applique de mani\u00e8re automatis\u00e9e la conversion en matrice de luminance 2D, calcule les moments statistiques d&rsquo;ordre sup\u00e9rieur (la moyenne de luminance spatiale et la variance du contraste RMS), puis applique si n\u00e9cessaire des op\u00e9rations de filtrage fr\u00e9quentiel dans le domaine spectral (filtrage passe-haut pour n&rsquo;isoler que les hautes fr\u00e9quences spatiales d\u00e9crivant les ar\u00eates, ou filtrage passe-bas pour ne conserver que les formes globales diffuses).<\/p>\n<p>Les tenseurs 2D ainsi purifi\u00e9s et normalis\u00e9s sont ensuite s\u00e9rialis\u00e9s et export\u00e9s soit vers des formats matriciels standardis\u00e9s non compress\u00e9s, soit compil\u00e9s sous forme d&rsquo;archives de tenseurs compress\u00e9s HDF5 ou de fichiers NumPy <code>.npz<\/code>. Ces banques de stimuli pr\u00eates \u00e0 l&#8217;emploi sont alors directement ing\u00e9r\u00e9es par les progiciels de passation psychophysique tels que PsychoPy, OpenSesame ou E-Prime, \u00e9liminant tout calcul de conversion redondant au moment critique de l&rsquo;affichage en temps r\u00e9el et garantissant une synchronisation temporelle rigoureuse \u00e0 la milliseconde pr\u00e8s sur le moniteur de laboratoire.<\/p>\n<h3>12.3 \u00c9volution vers la calibration photom\u00e9trique des moniteurs de laboratoire<\/h3>\n<p>Pour conclure cette \u00e9tude sur l&rsquo;affichage scientifique des niveaux de gris, il est fondamental de prendre conscience des limites physiques intrins\u00e8ques au sous-syst\u00e8me logiciel. M\u00eame si le pipeline de donn\u00e9es Python, Pillow, NumPy et Matplotlib s&rsquo;av\u00e8re parfait sur le plan math\u00e9matique et algorithmique, la restitution finale de l&rsquo;intensit\u00e9 lumineuse demeure tributaire des propri\u00e9t\u00e9s optiques mat\u00e9rielles de l&rsquo;\u00e9cran de visualisation (qu&rsquo;il s&rsquo;agisse d&rsquo;une dalle LCD \u00e0 r\u00e9tro\u00e9clairage LED, d&rsquo;un moniteur OLED ou d&rsquo;un \u00e9cran cathodique CRT de laboratoire).<\/p>\n<p>Les moniteurs grand public appliquent intrins\u00e8quement une fonction de transfert non lin\u00e9aire hautement agressive, historiquement d\u00e9sign\u00e9e sous le terme de correction gamma (<span class=\"arabpsy-math-inline\" data-latex=\"\\gamma \\approx 2.2\">$\\gamma \\approx 2.2$<\/span>). Cela implique que la relation entre la valeur num\u00e9rique du pixel (le scalaire <span class=\"arabpsy-math-inline\" data-latex=\"x in [0, 255]\">$x in [0, 255]$<\/span> g\u00e9r\u00e9 par Matplotlib) et la luminance photonique physique r\u00e9elle \u00e9mise par les luminophores de l&rsquo;\u00e9cran (<span class=\"arabpsy-math-inline\" data-latex=\"L\">$L$<\/span> exprim\u00e9e en cd\/m\u00b2) n&rsquo;est pas lin\u00e9aire, mais suit une loi de puissance approxim\u00e9e par la relation physique <span class=\"arabpsy-math-inline\" data-latex=\"L propto x^\\gamma\">$L propto x^\\gamma$<\/span>. Par cons\u00e9quent, une valeur de pixel de 128 ne produit pas la moiti\u00e9 de la luminance d&rsquo;un pixel de 255, mais \u00e0 peine 20 \u00e0 25 % de l&rsquo;intensit\u00e9 lumineuse totale admissible.<\/p>\n<p>Dans les exp\u00e9riences de psychophysique rigoureuses mesurant des fonctions de sensibilit\u00e9 au contraste ou des seuils d&rsquo;int\u00e9gration temporelle, cette distorsion non lin\u00e9aire mat\u00e9rielle est inacceptable. Elle impose d&rsquo;\u00e9tendre la cha\u00eene m\u00e9thodologique au-del\u00e0 de Matplotlib en proc\u00e9dant \u00e0 une calibration photom\u00e9trique de l&rsquo;\u00e9cran \u00e0 l&rsquo;aide d&rsquo;une sonde spectrophotom\u00e9trique physique (telle qu&rsquo;un colorim\u00e8tre ou un spectrophotom\u00e8tre de haute pr\u00e9cision). Cette mesure instrumentale permet de caract\u00e9riser la courbe de luminance r\u00e9elle de l&rsquo;\u00e9cran et de g\u00e9n\u00e9rer une table d&rsquo;inversion gamma (<em>gamma look-up table<\/em> ou gamma-LUT). En appliquant cette lin\u00e9arisation en amont, le chercheur s&rsquo;assure enfin que chaque incr\u00e9ment scalaire unitaire command\u00e9 au sein de sa matrice Python se traduit par un incr\u00e9ment d&rsquo;illumination physique parfaitement proportionnel dans le monde r\u00e9el, scellant ainsi l&rsquo;alliance d\u00e9finitive entre rigueur algorithmique logicielle et m\u00e9trologie physique absolue.<\/p>\n<h2>R\u00e9f\u00e9rences<\/h2>\n<ul>\n<li>Brainard, D. H. (1997). The Psychophysics Toolbox. <em>Spatial Vision<\/em>, 10(4), 433\u2013436. <a rel=\"noopener noreferrer\" href=\"https:\/\/doi.org\/10.1163\/156856897X00357\">https:\/\/doi.org\/10.1163\/156856897X00357<\/a><\/li>\n<li>Campbell, F. W., &amp; Robson, J. G. (1968). Application of Fourier analysis to the visibility of gratings. <em>The Journal of Physiology<\/em>, 197(3), 551\u2013566. <a rel=\"noopener noreferrer\" href=\"https:\/\/doi.org\/10.1113\/jphysiol.1968.sp008574\">https:\/\/doi.org\/10.1113\/jphysiol.1968.sp008574<\/a><\/li>\n<li>Harris, C. R., Millman, K. J., van der Walt, S. J., Gommers, R., Virtanen, P., Cournapeau, D., Wieser, E., Taylor, J., Berg, S., Smith, N. J., Kern, R., Picus, M., Hoyer, S., van Kerkwijk, M. H., Brett, M., Haldane, A., del R\u00edo, J. F., Wiebe, M., Peterson, P., \u2026 Oliphant, T. E. (2020). Array programming with NumPy. <em>Nature<\/em>, 585(7825), 357\u2013362. <a rel=\"noopener noreferrer\" href=\"https:\/\/doi.org\/10.1038\/s41586-020-2649-2\">https:\/\/doi.org\/10.1038\/s41586-020-2649-2<\/a><\/li>\n<li>Hubel, D. H., &amp; Wiesel, T. N. (1962). Receptive fields, binocular interaction and functional architecture in the cat&rsquo;s visual cortex. <em>The Journal of Physiology<\/em>, 160(1), 106\u2013154. <a rel=\"noopener noreferrer\" href=\"https:\/\/doi.org\/10.1113\/jphysiol.1962.sp006837\">https:\/\/doi.org\/10.1113\/jphysiol.1962.sp006837<\/a><\/li>\n<li>Hunter, J. D. (2007). Matplotlib: A 2D graphics environment. <em>Computing in Science &amp; Engineering<\/em>, 9(3), 90\u201395. <a rel=\"noopener noreferrer\" href=\"https:\/\/doi.org\/10.1109\/MCSE.2007.55\">https:\/\/doi.org\/10.1109\/MCSE.2007.55<\/a><\/li>\n<li>International Telecommunication Union. (2011). <em>Studio encoding parameters of digital television for standard 4:3 and wide-screen 16:9 aspect ratios<\/em> (Recommendation ITU-R BT.601-7). International Telecommunication Union. <a rel=\"noopener noreferrer\" href=\"https:\/\/www.itu.int\/rec\/R-REC-BT.601\">https:\/\/www.itu.int\/rec\/R-REC-BT.601<\/a><\/li>\n<li>Itti, L., Koch, C., &amp; Niebur, E. (1998). A model of saliency-based visual attention for rapid scene analysis. <em>IEEE Transactions on Pattern Analysis and Machine Intelligence<\/em>, 20(11), 1254\u20131259. <a rel=\"noopener noreferrer\" href=\"https:\/\/doi.org\/10.1109\/34.730558\">https:\/\/doi.org\/10.1109\/34.730558<\/a><\/li>\n<li>Peirce, J., Gray, J. R., Simpson, S., MacAskill, M., H\u00f6chenberger, R., Sogo, H., Kastman, E., &amp; Lindel\u00f8v, J. K. (2019). PsychoPy2: Experiments in behavior made easy. <em>Behavior Research Methods<\/em>, 51(1), 195\u2013203. <a rel=\"noopener noreferrer\" href=\"https:\/\/doi.org\/10.3758\/s13428-018-01193-y\">https:\/\/doi.org\/10.3758\/s13428-018-01193-y<\/a><\/li>\n<li>van der Walt, S., Colbert, S. C., &amp; Varoquaux, G. (2011). The NumPy array: A structure for efficient numerical computation. <em>Computing in Science &amp; Engineering<\/em>, 13(2), 22\u201330. <a rel=\"noopener noreferrer\" href=\"https:\/\/doi.org\/10.1109\/MCSE.2011.37\">https:\/\/doi.org\/10.1109\/MCSE.2011.37<\/a><\/li>\n<li>van der Walt, S., Sch\u00f6nberger, J. L., Nunez-Iglesias, J., Boulogne, F., Warner, J. D., Yager, N., Gouillart, E., &amp; Yu, T. (2014). scikit-image: Image processing in Python. <em>PeerJ<\/em>, 2, e453. <a rel=\"noopener noreferrer\" href=\"https:\/\/doi.org\/10.7717\/peerj.453\">https:\/\/doi.org\/10.7717\/peerj.453<\/a><\/li>\n<li>Yin, R. K. (1969). Looking at upside-down faces. <em>Journal of Experimental Psychology<\/em>, 81(1), 141\u2013145. <a rel=\"noopener noreferrer\" href=\"https:\/\/doi.org\/10.1037\/h0027474\">https:\/\/doi.org\/10.1037\/h0027474<\/a><\/li>\n<\/ul>\n","protected":false},"excerpt":{"rendered":"<p>Guide acad\u00e9mique complet pour afficher une image en niveaux de gris dans Matplotlib \u00e0 l&rsquo;aide de PIL, NumPy et du param\u00e8tre cmap=&rsquo;gray&rsquo; avec exemples d\u00e9taill\u00e9s.<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"closed","template":"","categories":[2465,1994,2687],"tags":[9324,3150,9323,9325,2468],"class_list":["post-8179","psych_stat","type-psych_stat","status-publish","hentry","category-programmation-python","category-psychologie-experimentale","category-visualisation-de-donnees","tag-cmap-gray","tag-matplotlib","tag-niveaux-de-gris","tag-pillow","tag-python"],"_links":{"self":[{"href":"https:\/\/french.arabpsychology.com\/index.php?rest_route=\/wp\/v2\/psych_stat\/8179","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/french.arabpsychology.com\/index.php?rest_route=\/wp\/v2\/psych_stat"}],"about":[{"href":"https:\/\/french.arabpsychology.com\/index.php?rest_route=\/wp\/v2\/types\/psych_stat"}],"author":[{"embeddable":true,"href":"https:\/\/french.arabpsychology.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/french.arabpsychology.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=8179"}],"version-history":[{"count":1,"href":"https:\/\/french.arabpsychology.com\/index.php?rest_route=\/wp\/v2\/psych_stat\/8179\/revisions"}],"predecessor-version":[{"id":8183,"href":"https:\/\/french.arabpsychology.com\/index.php?rest_route=\/wp\/v2\/psych_stat\/8179\/revisions\/8183"}],"wp:attachment":[{"href":"https:\/\/french.arabpsychology.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=8179"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/french.arabpsychology.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=8179"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/french.arabpsychology.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=8179"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}