Reconstrucción por medio de múltiples vistas
Un objeto en 3D puede ser reconstruido a partir de múltiples vistas en 2D. ImageDisplacements es utilizado para determinar el paralaje de una vista a la otra. Cuanto mayor sea el cambio de paralaje, más se acerca el objeto detrás del correspondiente pixel. Con esta información profunda, usted puede extrudir los vértices de un objeto de malla obtenido por medio de ImageMesh y TriangulateMesh. El resultado se muestra por medio de un mapeo de textura en el objeto de malla en 3D.
Obtenga una máscara de objeto de la imagen central.
mask = Erosion[Binarize[imgs[[2]], 0], 1];
Determine el paralaje en las imágenes de la izquierda y derecha con respecto a la imagen en el centro.
parallaxL = First@ImageDisplacements[imgs[[{2, 1}]]];
parallaxR = First@ImageDisplacements[imgs[[{2, 3}]]];
Combine estos desplazamientos en un paralaje total.
parallax = parallaxL - parallaxR;
En un entorno dado, el componente del paralaje es aproximadamente proporcional a la profundidad de la fuente de pixel correspondiente.
depth = Blur@
Opening[ImageMultiply[ImageAdjust@Image[parallax[[All, All, 1]]],
mask], DiskMatrix[4]]
Construya una función de profundidad.
depthFunction = ListInterpolation[Transpose@Reverse@ImageData[depth]];
Obtenga un objeto de malla con refinamiento que dependa de la prominencia del objeto.
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]
]
Extrude el objeto de malla con la función de profundidad.
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
]
Extraiga la textura de objeto de la imagen central.
texture = SetAlphaChannel[imgs[[2]], mask]
Mapee la textura en el objeto en 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
]