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
Malak - 1 juin 2017 à 17:36
A voir également:
- Superposer deux image sur matlab
- Image iso - Guide
- Faire deux colonnes sur word - Guide
- Deux ecran pc - Guide
- Acronis true image - Télécharger - Sauvegarde
- Deux whatsapp sur un téléphone - Guide
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
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.
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.
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
6 déc. 2009 à 00:31
bonsoir
même si ça fait un bail, pourrez je avoir la réponse?
merci
même si ça fait un bail, pourrez je avoir la réponse?
merci
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
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...
_ 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...
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
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
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
7 nov. 2008 à 17:10
J'ai trouvé merci
1 juin 2017 à 17:36