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.
Obtenez un masque d'objet du centre de l'image.
mask = Erosion[Binarize[imgs[[2]], 0], 1];
Déterminez la parallaxe dans les images gauche et droite par rapport au centre de l'image.
parallaxL = First@ImageDisplacements[imgs[[{2, 1}]]];
parallaxR = First@ImageDisplacements[imgs[[{2, 3}]]];
Combinez ces déplacements dans une parallaxe complète.
parallax = parallaxL - parallaxR;
Compte tenu de la configuration, la composante de la parallaxe est à peu près proportionnelle à la profondeur de la source du pixel correspondante.
depth = Blur@
Opening[ImageMultiply[ImageAdjust@Image[parallax[[All, All, 1]]],
mask], DiskMatrix[4]]
Créez une fonction de profondeur.
depthFunction = ListInterpolation[Transpose@Reverse@ImageData[depth]];
Obtenez un objet avec un raffinement de maillage qui dépend de la saillance de l'objet.
resolution = ImageAdjust@ImageSaliencyFilter[imgs[[2]]];
resolutionFunction =
ListInterpolation[Transpose@Reverse@ImageData@resolution];
\[CapitalOmega] = TriangulateMesh[
ImageMesh[Erosion[mask, DiskMatrix[2]]],
MeshRefinementFunction ->
Function[{vertices, area},
area > 32 + 512 (1 - resolutionFunction @@ Mean[vertices])^6]
]
Extrudez le maillage de l'objet avec la fonction de profondeur.
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
]
Extrayez l'objet de texture à partir de l'image centrale.
texture = SetAlphaChannel[imgs[[2]], mask]
Appliquez la texture sur l'objet 3D.
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
]