370 likes | 741 Views
Vision des couleurs et création d’images. Pascal Lamboley et Jean-Marcel Piriou. Sommaire. La vision des couleurs par l’œil humain La vision des couleurs chez les insectes, mammifères, primates. Le RVB comme famille libre et génératrice des couleurs visibles?
E N D
Vision des couleurs et création d’images Pascal Lamboley et Jean-Marcel Piriou
Sommaire • La vision des couleurs par l’œil humain • La vision des couleurs chez les insectes, mammifères, primates • Le RVB comme famille libre et génératrice des couleurs visibles? • Couleurs additives, soustractives, monochromatiques • Le format image PPM • Gestion des transparences couleur
Vision des couleurs par l’œil humain: cônes et bâtonnets Bâtonnets (1 type): vision nocturne Cônes (3 types): vision diurne
Vision des couleurs par l’œil humain: spectres d’absorption des cônes (vision diurne) • Couleurs et convolution • Pigeons, insectes, mammifères non primates • Trichromie humaine et berceau africain • Daltonisme / Vision féminine • RVB libre et génératrice?
Vision et résolution Œil humain: pouvoir séparateur de 1.E-4 rad environ Écran de PC / station: 1280x1024 points, écran de 60 cm vu à 70 cm 7.E-4 rad Projecteur RVB: 1024x768 points, écran de 2 m vu à 7 m 3.E-4 rad Mammifères Œil du condor
Persistance rétinienne et animation Œil humain: persistance rétinienne de 1/20 s Cinéma muet: 16 images/s sensation de saccadé Cinéma actuel: 24 à 30 images/s dessins animés Vidéo: 30 images/s Site WEB W3: de 5 à 15 images/s Un mouvement fluide demande plus de 23 images/s Quid du chien et de la mouche au cinéma?
La vision: un cocktail de plusieurs ingrédients Sens chromatique Résolution Renouvellement des images Vision du relief, du mouvement
Couleurs additives Couleurs additives primaires: rouge, vert, bleu Téléviseurs, moniteurs, projecteurs
Couleurs soustractives Couleurs soustractives primaires: cyan,magenta, jaune - Cyan = bleu + vert = blanc – rouge filtre le rouge! - Magenta = rouge + bleu = blanc – vert filtre le vert! - Jaune = rouge + vert = blanc – bleu filtre le bleu! Imprimantes, aquarelles
Lien couleurs additives / soustractives Les couleurs additives et soustractives primaires entretiennent entre elles une relation très simple: elles sont inverses vidéo!…
Couleurs monochromatiques Leur spectre est un Dirac à une longueur d’onde donnée Rayonnement monochromatique bleu: active le seul cône bleu Rayonnement monochromatique jaune: active également les cônes rouges et verts
Le format image PPM (Portable PixMap): une écriture directe des triplets RVB P6# 600 400# 255# (255)(000)(000)(000)(000)(200)… # = retour chariot Pour une image de Nx points en X et Ny points en Y, la taille du fichier PPM associé sera de (3*Nx*Ny+ quelques octets pour l’en-tête) Exemple: 600x400 environ 720 ko
Exemple d’écriture de fichier PPM: dégradé de rouge program demo!! Taille de l'image.!ix=600 ; iy=400!! En-tête du fichier PPM.!open(1,file='image_rouge.ppm',form='formatted')write(1,fmt='(a)') 'P6'write(1,fmt='(2i6)') ix,iywrite(1,fmt='(i6)') 255!! Ecriture des triplets RVB.!do jy=1,iy do jx=1,ix zratiox=real(jx-1)/real(ix-1) ir=max(0,min(255,int(256.*zratiox))) iv=0 ib=0 write(1,fmt='(3a)',advance='no') char(ir),char(iv),char(ib) enddoenddoclose(1)end
Exemple d’écriture de fichier PPM: RVB avec R+V+B constant program demointeger, allocatable :: irvb(:,:,:)!! Taille de l'image.!ix=600 ; iy=400 ; allocate (irvb(3,ix,iy))!! Ecriture des triplets RVB.!do jy=1,iy zratioy=real(jy-1)/real(iy-1) do jx=1,ix zratiox=real(jx-1)/real(ix-1) irvb(1,jx,jy)=max(0,min(255,int(256.*zratiox))) ! Rouge en X. irvb(2,jx,jy)=max(0,min(255,int(256.*zratioy))) ! Vert en Y. irvb(3,jx,jy)=max(0,min(255,255-irvb(1,jx,jy)-irvb(2,jx,jy))) ! Bleu: le complément à 1. enddoenddo!! Ecriture du fichier PPM.!call img_ecr('demo3.ppm',ix,iy,irvb)end
Exemple de lecture / écriture de fichier PPM: filtrage program paletteinteger, allocatable :: irvb(:,:,:)real, allocatable :: zchamp(:,:)character*200 clppm1,clppm2clppm1='perroquet.ppm' clppm2='demo5.ppm' !!-------------------------------------------------! Lecture d'une image.!-------------------------------------------------!call img_taille(clppm1,ix,iy) ! Taille de l’image d’entrée.allocate (irvb(3,ix,iy)) ! Allocation du tableau des triplets RVB.call img_lec(clppm1,ix,iy,irvb) ! Lecture des triplets sur le tableau irvb.!!-------------------------------------------------! Filtrage des 2/3 du bleu.!-------------------------------------------------!do jy=1,iy do jx=1,ix irvb(3,jx,jy)=max(0,min(255,irvb(3,jx,jy)/3))enddoenddo!! Ecriture du fichier PPM.!call img_ecr(clppm2,ix,iy,irvb)end
Application au tracé de champs météorologiques • Colorisation de champs 2D • Saisie de palettes externes • Fondus et transparences
1. Colorisation de champs 2D program paletteinteger, allocatable :: irvb(:,:,:)real, allocatable :: zchamp(:,:)!! Taille de l'image.!ix=8640 ; iy=4320 ; allocate (zchamp(ix,iy)) ; allocate (irvb(3,ix,iy))!!-------------------------------------------------! Lecture du champ.!-------------------------------------------------!open(1,file='relief_5km.dta',form='unformatted') ; read(1) zchamp ; close(1)!!-------------------------------------------------! Application d'une palette .!-------------------------------------------------! call palette_noir_vert_jaune_rouge(ix,iy,zchamp,irvb)!! Ecriture du fichier PPM.!call img_ecr('demo4.ppm',ix,iy,irvb)end
Subroutine palette_noir_vert_jaune_rouge(kx,ky,pchamp,krvb) Integer krvb(3,kx,ky) Real pchamp(kx,ky) Integer, parameter :: jppal = 4 Integer ipalette(3,jppal) ! ! Tabulation des points de passage. ! ipalette(1,1)=000 ; ipalette(2,1)=000 ; ipalette(3,1)=000 ! Noir. ipalette(1,2)=000 ; ipalette(2,2)=255 ; ipalette(3,2)=000 ! Vert. ipalette(1,3)=255 ; ipalette(2,3)=255 ; ipalette(3,3)=000 ! Jaune. ipalette(1,4)=255 ; ipalette(2,4)=000 ; ipalette(3,4)=000 ! Rouge. !! Extrêmes du champ réel d’entrée.!zmin=minval(pchamp) ; zmax=maxval(pchamp) ! ! La valeur du champ est convertie en couleurs, ! Selon une ligne brisée comportant jppal points de passage. ! do jy=1,ky do jx=1,kx zpassage= real(jppal)*(pchamp(jx,jy)-zmin)/(zmax-zmin) ipassage=max(1,min(jppal,1+int(zpassage))) ipassage1=min(jppal,ipassage+1) zf=zpassage-int(zpassage) do jcoul=1,3 zoctet= (1.-zf)*real(ipalette(jcoul,ipassage)) & & + zf* real(ipalette(jcoul,ipassage1)) krvb(jcoul,jx,jy)=max(0,min(255,nint(zoctet))) enddo enddo enddoend
Epaisseur optique et gestion des transparences couleur • Pour gérer une couche hémi-transparente, on peut souvent se placer dans un cadre plus simple: • On a un fond et un premier plan. • Le fond est défini en chaque point par sa couleur: Rf, Vf, Bf. • Idem premier plan: Rpp, Vpp, Bpp. • Si la transparence t est la même pour R,V et B, si l’émission est égale à l’absorption (loi de Kirchhof), et r=0 on obtient • R = (1-t) Rpp + t Rf • - V = (1-t) Vpp + t Vf • - B = (1-t) Bpp + t Bf
Passage PPM autres formats: usage de convert GIF JPG PS, EPS TIFF ETC!… PPM
Conclusions vision et base RVB • La vision colorimétrique humaine se ramène assez bien à trois degrés de liberté • Le format PPM permet de lire/écrire aisément des images via FORTRAN ou C • Convert permet de passer dans les deux sens de PPM aux autres formats GIF, JPG, TIFF, etc...