Wolfram Language

Traitement des images et des signaux

Reconstruction à vue multiple

Un objet 3D peut être reconstruit à partir de plusieurs vues en 2D. Utilisez ImageDisplacements pour déterminer la parallaxe d'une vue à l'autre. Plus le changement de parallaxe est grand, plus l'objet derrière le pixel correspondant se rapproche. Avec cette information en profondeur, vous pouvez extruder les sommets d'un maillage d'objets obtenus à l'aide d' ImageMesh et de TriangulateMesh. Le résultat est affiché via l'application de texture sur l'objet de maillage en 3D.

In[1]:=
Click for copyable input

Obtenez un masque d'objet du centre de l'image.

In[2]:=
Click for copyable input
mask = Erosion[Binarize[imgs[[2]], 0], 1];

Déterminez la parallaxe dans les images gauche et droite par rapport au centre de l'image.

In[3]:=
Click for copyable input
parallaxL = First@ImageDisplacements[imgs[[{2, 1}]]];
In[4]:=
Click for copyable input
parallaxR = First@ImageDisplacements[imgs[[{2, 3}]]];

Combinez ces déplacements dans une parallaxe complète.

In[5]:=
Click for copyable input
parallax = parallaxL - parallaxR;

Compte tenu de la configuration, la composante x de la parallaxe est à peu près proportionnelle à la profondeur de la source du pixel correspondante.

In[6]:=
Click for copyable input
depth = Blur@ Opening[ImageMultiply[ImageAdjust@Image[parallax[[All, All, 1]]], mask], DiskMatrix[4]]
Out[6]=

Créez une fonction de profondeur.

In[7]:=
Click for copyable input
depthFunction = ListInterpolation[Transpose@Reverse@ImageData[depth]];

Obtenez un objet avec un raffinement de maillage qui dépend de la saillance de l'objet.

In[8]:=
Click for copyable input
resolution = ImageAdjust@ImageSaliencyFilter[imgs[[2]]];
In[9]:=
Click for copyable input
resolutionFunction = ListInterpolation[Transpose@Reverse@ImageData@resolution];
In[10]:=
Click for copyable input
\[CapitalOmega] = TriangulateMesh[ ImageMesh[Erosion[mask, DiskMatrix[2]]], MeshRefinementFunction -> Function[{vertices, area}, area > 32 + 512 (1 - resolutionFunction @@ Mean[vertices])^6] ]
Out[10]=

Extrudez le maillage de l'objet avec la fonction de profondeur.

In[11]:=
Click for copyable input
Graphics3D[ GraphicsComplex[ Apply[{##, depthFunction[##]} &, MeshCoordinates[\[CapitalOmega]], {1}], {EdgeForm[], MeshCells[\[CapitalOmega], 2]} ], PlotRange -> Append[Thread[{0, ImageDimensions[mask]}], {0, 1}], BoxRatios -> {1, 1, 2/3}, ViewPoint -> Top ]
Out[11]=

Extrayez l'objet de texture à partir de l'image centrale.

In[12]:=
Click for copyable input
texture = SetAlphaChannel[imgs[[2]], mask]
Out[12]=

Appliquez la texture sur l'objet 3D.

In[13]:=
Click for copyable input
Graphics3D[ {Texture[texture], GraphicsComplex[ Apply[{##, depthFunction[##]} &, MeshCoordinates[\[CapitalOmega]], {1}], {EdgeForm[], MeshCells[\[CapitalOmega], 2]}, VertexTextureCoordinates -> Map[#/ImageDimensions[texture] &, MeshCoordinates[\[CapitalOmega]]] ] }, PlotRange -> Append[Thread[{0, ImageDimensions[mask]}], {0, 1}], BoxRatios -> {1, 1, 2/3}, Lighting -> {{"Ambient", White}}, ViewPoint -> Top, Boxed -> False ]
Jouer l'animation
Arrêter l'annimation

Exemples connexes

de en es ja ko pt-br ru zh