Superposer deux image sur matlab

Résolu/Fermé
paul404 Messages postés 47 Date d'inscription lundi 21 juillet 2008 Statut Membre Dernière intervention 29 novembre 2008 - 7 nov. 2008 à 16:33
 Malak - 1 juin 2017 à 17:36
Bonjour,

Je voudrais savoir comment on fais pour supperposer deux images sur matlab. A ce que j'ai compris on doit utilisé la comande hold on mais comment marche t'elle ?

hold on (image1,image2) ?

il me dit qu'il y na trop d'argument ..?

Merci de votre aide merci.
A voir également:

7 réponses

HidirABAY Messages postés 1 Date d'inscription mardi 5 juillet 2016 Statut Membre Dernière intervention 5 juillet 2016 2
5 juil. 2016 à 11:28
Bonjour, je poste la réponse car cela peut toujours servir à quelqu'un bien que la question a été posée il y a 3 ans.

C'est très très simple : il suffit de créer une matrice en 3D.
Tes images sont numériquement des matrices. L'image 1 renvoi une matrice, l'image 2 renvoit une autre matrice.

L'astuce est donc de créer une matrice M de taille (m,n,2) avec m et n la taille de tes images. Donc tu fais : M(:,:,1)=image1 et M(:,:,2)=image 2. Ensuite tu plot ces deux matrices sur la même image (en faisant un HOLD ON). Et le tour est joué !

Si tes images ne sont pas de la même taille c'est simple (attention il faut suivre) :
- tu analyse quelle est la longueur la plus longue et qu'elle est la largeur la plus longue : cela te donne a et b, respectivement.
- ensuite tu créée tes deux matrices M en prenant comme taille (c'est a dire m et n) a et b. Du coup tes deux matrices sont de la taille M(a,b,1) et M(a,b,2). Tu remplis ces matrices avec des NaN.
- Maintenant que tu as des matrices remplies de NaN, tu les re-remplis avec les valeurs de image1 et image2. Tu auras donc des matrices remplies de valeurs et de NaN.

Du coup tu procède au plot comme précédemment. L'astuce est que les NaN ne sont pas ploté ce qui est excellent car si tu deux images qui ne sont pas de la même taille, tu ne peux pas les ploter en même temps aussi facilement que ca.

Voila voila.

Amicalement.
1
Wooaw! Merci beaucoup! ça m'a beaucoup aidé! :)
0
En principe il suffit de faire 'hold on ' tout simplement sans ajouter de parenthèses
0
OConell Messages postés 139 Date d'inscription samedi 1 novembre 2008 Statut Membre Dernière intervention 13 octobre 2010 8
6 déc. 2009 à 00:31
bonsoir

même si ça fait un bail, pourrez je avoir la réponse?

merci
0
OConell Messages postés 139 Date d'inscription samedi 1 novembre 2008 Statut Membre Dernière intervention 13 octobre 2010 8
7 janv. 2010 à 13:31
Bon alors je n'expliquerais pas en details, ça fait un moment que j'ai pas touché à ce code, mais pour faire simple :
_ but : superposer 2 images de tailles différentes (ça doit marché pour des images de même taille).
_ si je me souviens, frame est la plus grande (le fond)
_ scale est un coefficient de proportion
_ mask : sert lorsque qu'on ne veut pas que toute l'image de destination soit modifiée. Cette source vient d'un projet l'image à incruster ne devait pas se superposer sur certains objets (détecté par leur couleur).

ATTENTION : code plus simple et moins optimisé après.

function frame=motif2frame(motif,frame,x,y,scale,mask)
% motif : image 'source'
% frame : image 'destination'
% x,y : coordonnées des 4 sommets de la 'source' dans la 'destination'
% scale : paramètre d'échelle
% mask : masque 'destination' des pixels à ne pas modifier

[hIn,wIn]=size(motif);
xIn=[1 wIn wIn 1];
yIn=[1 1 hIn hIn];
xIn=wIn/2+scale*(xIn-wIn/2);
yIn=hIn/2+scale*(yIn-hIn/2);
tForm=cp2tform([xIn' yIn'],[x' y'],'projective');
[motifTransform,xData,yData]=imtransform(motif,tForm,'Fill',-1);
[hOut,wOut]=size(motifTransform);
xOut=fix(xData(1));
yOut=fix(yData(1));
dxOut=xOut:xOut+wOut-1;
dyOut=yOut:yOut+hOut-1;
pos=find(mask(dyOut,dxOut)==1);
if (length(pos))
motifTransform(pos)=-1;
end
pos=find(motifTransform~=-1);
for p=1:3
frameCut=frame(dyOut,dxOut,p);
if (length(pos))
frameCut(pos)=uint8(motifTransform(pos));
end
frame(dyOut,dxOut,p)=frameCut;
end

-------------------------------------------------------------------------------

2ème code :

photo2 : image à incruster (la plus petite)
attention aussi au codage des images. ici en uint8
xMin, xMax, yMin, yMax : définissent la zone de la nouvelle image dans laquelle on incruste la 2ème image. (a calculer avant)

height = size(photo2,1);
width = size(photo2,2);
xMax = xMin+width-1;
yMax =yMin+height-1;

for j=xMin:xMax
for i=yMin:yMax
if(photo2(i-yMin+1,j-xMin+1,1)~=-1) %permet de ne pas remplacer les pixels de photo2 = -1. -1 n'est pas une valeur de couleur, elle est obtenu par des traitements. Si votre image doit être incrusté entièrement, 'if' inutil.

img_vid(i,j,1)=uint8(photo2(i-yMin+1,j-xMin+1,1));
img_vid(i,j,2)=uint8(photo2(i-yMin+1,j-xMin+1,2));
img_vid(i,j,3)=uint8(photo2(i-yMin+1,j-xMin+1,3));
end
end
end

--------------------------------------------------------------------
Si vous ne comprenez pas mes explications hésitez pas à poser des questions...
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Bonjour,

j'ai deux images binairisées, je voudrai les superposer.
j'ai utilisé ce code en haut mais ça marche pas

quelqu'un peut m'aider SVP

je suis débutant
0
paul404 Messages postés 47 Date d'inscription lundi 21 juillet 2008 Statut Membre Dernière intervention 29 novembre 2008
7 nov. 2008 à 17:10
J'ai trouvé merci
-1
SI c'est des plots Que tu parle tu fait plot(x,y)
hold on
plot(x2,y2)

mais si c'est pour une superposition de matrice d'image je suis dans la même galère.
Ni la concaténation ni l'addition ne me donnent la bonne image.
au cas ou quelqu'un saurait faire ça facilement ?
-1