Du signal audio numérique à l'image numérique Cours S.S.I.I., séance 9, décembre 2013, durée : 55 mn, Jean-Paul Stromboni pour les élèves SI3 Objectif et contenu de cette séance : Objectif : étendre aux images numériques les notions introduites pour le signal audio numérique : échantillonnage, quantification, filtrage, et plus tard spectre et compression Contenu : on voit les notions de résolution, d’image de niveaux de gris, de codage RGB et YUV, de colormap, de filtre d’image, le problème de détection de contours … avec Scilab. Outils : installer la boîte à outils SIVP dans Scilab Pour installer SIVP, dans Scilab, aller dans le menu ‘Applications’ puis dans le menu ‘Gestionnaire de Modules’, et installer ‘Scilab Image and Video Processing’ Installer également le logiciel libre et gratuit IMLAB de traitement d’images utilisé ici Savez vous répondre aux questions suivantes ? Que signifie résolution de 30 ppp d’une image ? En quoi une image de niveau de gris diffère-t’elle d’une image RVB ? Comment distinguer une image en noir et blanc et une image en niveaux de gris ? Donner la réponse impulsionnelle ou masque, ou noyau, du filtre de Prewitt horizontal Combien de pixels sur 10 cm en résolution 30 dpi ? Une table de 256 couleurs codées sur 8 bits occupe combien d’octets ?
La lumière est une onde électromagnétique Lumière : ensemble d’ondes électromagnétiques visibles, dont les longueurs d’ondes sont comprises entre environ 400 nm et 700 nm Se propage dans le vide avec la célérité c = 3 10^8 m/s environ Relation entre fréquence et longueur d’onde : l = c / f Lumière monochromatique : contient une seule fréquence/longueur d’onde Tiré de http://www.techno-science.net, domaines de longueurs d’onde des ondes électromagnétiques :
Synthèse additive de la lumière A une longueur d’onde donnée l=c/f, correspond une couleur primaire (équivalent de la note pure sinusoïdale pour le signal audio). On montre que la lumière « blanche » peut être obtenue en faisant la somme des couleurs primaires (voir la roue de Newton, XVIIème siècle) Synthèse additive RVB: on peut aussi obtenir de la lumière blanche en additionnant seulement 30% de lumière rouge, 60% de vert et 10% de bleu, c’est le principe de calcul de la luminance Y (cf. ci après). Synthèse soustractive CMJ (utilisée en imprimerie), on soustrait les couleurs Cyan, Magenta et Jaune à la lumière blanche, on obtient du noir. Tiré de http://semsci.u-strasbg.fr/primcol.htm
Luminance et chrominance L’œil est plus sensible à la luminance (noir et blanc, clair et sombre) qu’à la chrominance (couleur), cf. ci-dessous tiré de http://semsci.u-strasbg.fr/efflum.htm D’où le codage YUV (ou Y Cb Cr) des images TV à partir des informations R, G (vert) et B Y est la luminance, maximum de lisibilité pour l’œil humain, CB et CR sont les chrominances bleue et rouge, pour reconstruire les informations de couleur
Du signal audio numérique à … l’image numérique En résumé : la durée devient la distance, le temps devient espace, et une dimension devient deux. x y L H y découpé en M lignes x découpé en N colonnes Im(x,y) s(t) t D
Caractère numérique d’une image de niveaux de gris L'image suivante est tracée par Imlab qui affiche les pixels de la zone indiquée par le curseur : définition horizontale : 358 pixels, définition verticale : 587 pixels, 8 bits par pixel, soient 256 valeurs possibles, de 0 pour un pixel noir à 255 pour un pixel blanc. Propriétés de ‘moon.png’ : Largeur : 358 pixels Hauteur : 537 pixels Profondeur couleur: 8 Taille: 85,7ko (87 809 octets)
Dans l’espace de couleurs ‘RGB’, une image couleur est la superposition de trois images de niveaux de gris : une rouge, une verte et une bleue : Im=imread(‘Joconde.jpg’); // avec Scilab et SIVP imshow(Im); // par contre pour afficher Pixel Region, utiliser IMLAB size(Im) // donne 300 par 198 par 3, pourquoi ? Avec Imlab seulement, zoom sur « le sourire de Mona Lisa » Properties ‘joconde.jpg’ (Windows) Largeur : 198 pixels Hauteur : 300 pixels Résolution : 30 ppp Profond. couleur: 24 Taille 7,10Ko(7276o)
Séparer les trois images de niveau de gris R, G (vert) et B Avec Imlab, menu Process, puis Split components Donne les trois images ci-contre : // avec SIVP // Afficher R, G et B rgb=imread('Joconde.jpg'); r=rgb; r(:,:,[2,3])=0; // ? imshow(r) imwrite(r,'jocr.jpg'); g=rgb; g(:,:,[1,3])=0; imshow(g) b=rgb; b(:,:,[1,2])=0; imshow(b)
Extraire luminance et chrominances avec Imlab À l’aide de IMLAB, menu Image/Color space, choisir YCrCb, puis menu Process, choisir Split components, et voici Y, Cr et Cb pour ‘joconde.jpg’ On voit que Y la luminance à gauche, contient plus d’information que Cr et Cb : la fonction Scilab rgb2gray calcule Y pour transformer l’image couleur en niveaux de gris on sous-échantillonne les plans U et V dans un rapport 2 pour compresser l’image
Calculer luminance et chrominance et sous échantillonner une image avec Scilab // sauver l’image dans Im Im=imread('joconde.jpg'); // calculer Y, Cr, et Cb YCrCb=rgb2ycbcr(Im); Cr=YCrCb(:,:,1); Y=YCrCb(:,:,2); Cb=YCrCb(:,:,3); // afficher Cr imshow(Cr) [l,c]=size(Cr) //sous échantillonner Cr //dans un rapport 4 Cr4=Cr(1:2:l,1:2:c); imshow(Cr4)
Histogramme d’image, médiane, écart type et contraste. lena=imread('lena.png'); imshow(lena) lenay=rgb2gray(lena); imshow(lenay) scf(2); bar(imhist(lenay),1,'green'); // foncer lenay imshow(imsubtract(lenay,40)) // imadd pour éclaircir // lenay doit être réelle median(double(lenay)) stdev(double(lenay)) //mediane de lenay: 129. //stdev de lenay: 47.85 0. 129. 255.
Pour varier le contraste, on multiplie l’écart type à médiane constante function Z= contraste(X, t) n=size(X,1);p= size(X,2); Z=double(X);b=median(Z); M(1:n,1:p)=b; Z=M+ t*(Z-M); M(:)= 255; Z=min(Z,M); M(:)= 0; Z=max(Z,M); Z=uint8(Z); endfunction lenayc=contraste(double(lenay),1.5); imshow(lenayc) bar(imhist(lenayc),1,'green'); median(double(lenayc)) stdev(double(lenayc)) // mediane lenayc: 129. // stdev lenayc: 83.79 0. 129. 255.
Comment filtrer une image numérique : Comme pour le signal audio, on peut créer des filtres numériques pour les images : Un filtre passe haut amplifie les hautes fréquences spatiales (discontinuités, contours, bruits Un filtre passe bas favorise les basse fréquences spatiales, atténue les contours, les discontinuités spatiales, les bruits, mais crée du flou. On procède par produit de convolution à deux dimensions: Soit h, de 2*R+1 lignes et 2*R+1 colonnes, réponse impulsionnelle du filtre d’image, ou masque ou encore noyau de ce filtre Soit Im image à filtrer dans un tableau de X lignes et Y colonnes On calcule le pixel filtré F(i, j) (i varie de 1 à X, j varie de 1 à Y) en faisant le produit de convolution de Im par h : Noter la division par N, taille du noyau h. dans SIVP, la fonction ‘imfilter’ calcule ce produit de convolution : F= imfilter(Im, h);
Application au filtrage d’une image N x M par un filtre 3 x 3 en Scilab L’image à filtrer est dans le vecteur Scilab I =[I(i, j), i=1..M, j=1.. N] Le noyau h du filtre est h=[h(m, n), m=1,2,3 et n=1,2,3] L’image filtrée est F=[F(i,j), i=1..M, j= 1.. N] On calcule le pixel F(i,j) de l’image filtrée comme suit : F(i,j)=I(i,j)*h(2,2)+ I(i, j+1)*h(2,1)+ I(i, j-1)*h(2,3)+ I(i+1,j)*h(1,2)+ I(i+1, j+1)*h(1,1)+ I(i+1, j-1)*h(1,3)+ I(i-1,j)*h(3,2)+ I(i-1, j+1)*h(3,1)+ I(i-1, j-1)*h(3,3) On divise ensuite F(i,j) par la taille du noyau h : F(i, j)= F(i, j)/9 On impose F(i, j) = 0 quand i=0, j=0, i=M et j=N Voici l’équation du filtre : Généralisation pour un filtre de noyau 2*R+1 par 2*R+1
Exemples de filtrage de l’image lena par un laplacien (dérivée seconde) // filtrer l'image lena //filtre laplacien lena=imread('lena.png'); h = fspecial('laplacian'); imf = imfilter(lena,h); imshow(imf);
Une application au problème de détection des contours d’une image I(x,y) ci contre est le niveau de gris d’une photographie, x et y peuvent prendre toutes les valeurs entre 0 et L pour x, 0 et H pour y. Détecter les contours, c’est situer les zones de l’image où l’intensité varie « brusquement » : On calcule le gradient de I(x,y) La dérivée partielle horizontale La dérivée partielle verticale On évalue le module et l’argument du vecteur gradient : Le module mesure l’importance de la variation d’intensité L’argument indique la normale du contour On compare le module du gradient à un seuil paramétrable pour distinguer I(x,y) y x
Déterminer un filtre qui calculera les dérivées partielles Ix et Iy Réponse impulsionnelle de ce filtre : Application de h à : Filtre différenciateur centré : Donner l’équation du filtre : Filtres de Prewitt : h = fspecial('prewitt'); // donne dans h
Application : on filtre l’image de niveaux de gris avec h puis h’ // Scilab SIVP image='joconde.jpg'; im = imread(image); imd=im2double(im); img = rgb2gray(imd); imshow(img) // avec Scilab et SIVP h= fspecial(‘prewitt’) imfx = imfilter(img, h'); aimfx=imcomplement(abs(imfx)); imwrite(aimfx,’aimfx.png’); // avec Scilab et SIVP imfy = imfilter(img, h); aimfy=imcomplement(abs(imfy)); imwrite(aimfx,’aimfy.png’);
Puis on somme imfx et imfy pour évaluer le module du gradient et on lui applique un seuillage pour déterminer le contour : // seuil croît seuil=0.5; imc=imcontour; imc(imc<seuil)=0; imc(imc>0)=0.9; imc=imcomplement(imc); imwrite(imc,’./imc.png’) // seuil ‘bas’ seuil=0.3; imc=imcontour; imc(imc<seuil)=0; imc(imc>0)=0.9; imc=imcomplement(imc); imwrite(imc,’./imc.png’) // sans seuil imcontour=abs(imfx)+abs(imfy); imwrite(imcontour), './c.png');
L’œil différencie 2 millions de couleurs, 24 bits en créent plus de 16 L’œil différencie 2 millions de couleurs, 24 bits en créent plus de 16.7 millions, utiliser une table de couleurs (colormap ) est un moyen de compresser une image Une colormap est un tableau de 2A cases contenant chacune une intensité codée sur B bits, avec 2B>2A (par exemple 256 couleurs codées chacune sur 24 bits). Chaque pixel contient alors un index, adresse sur A bits de la case de la colormap où lire la couleur du pixel. Il en résulte un taux de compression : C = B/A. Scilab contient des colormaps, telles que pinkcolormap, et permet d’en définir de nouvelles : b=imread('moon.png'); cmap=pinkcolormap(64); c=ind2rgb(b,cmap); imshow(c); size(cmap) 64 3 La matrice cmap est constituée de trois colonnes R, V et B où il est permis de constituer sa propre colormap ou de choisir pinkcolormap ou … Taux de compression ici ? L’image c est quatre fois plus petite que b, pourquoi ?