Superposer deux image sur matlab
Résolu
paul404
Messages postés
47
Date d'inscription
Statut
Membre
Dernière intervention
-
Malak -
Malak -
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.
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:
- Superposer deux image sur matlab
- Comment faire deux colonnes sur word - Guide
- Image iso - Guide
- Deux ecran pc - Guide
- Nombre de jours entre deux dates excel - Guide
- Deux whatsapp sur un téléphone - Guide
7 réponses
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.
Malak
Wooaw! Merci beaucoup! ça m'a beaucoup aidé! :)
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