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.
![Click for copyable input](assets.es/multi-view-reconstruction/In_62.png)
Obtenga una máscara de objeto de la imagen central.
![Click for copyable input](assets.es/multi-view-reconstruction/In_63.png)
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.
![Click for copyable input](assets.es/multi-view-reconstruction/In_64.png)
parallaxL = First@ImageDisplacements[imgs[[{2, 1}]]];
![Click for copyable input](assets.es/multi-view-reconstruction/In_65.png)
parallaxR = First@ImageDisplacements[imgs[[{2, 3}]]];
Combine estos desplazamientos en un paralaje total.
![Click for copyable input](assets.es/multi-view-reconstruction/In_66.png)
parallax = parallaxL - parallaxR;
En un entorno dado, el componente del paralaje es aproximadamente proporcional a la profundidad de la fuente de pixel correspondiente.
![Click for copyable input](assets.es/multi-view-reconstruction/In_67.png)
depth = Blur@
Opening[ImageMultiply[ImageAdjust@Image[parallax[[All, All, 1]]],
mask], DiskMatrix[4]]
![](assets.es/multi-view-reconstruction/O_29.png)
Construya una función de profundidad.
![Click for copyable input](assets.es/multi-view-reconstruction/In_68.png)
depthFunction = ListInterpolation[Transpose@Reverse@ImageData[depth]];
Obtenga un objeto de malla con refinamiento que dependa de la prominencia del objeto.
![Click for copyable input](assets.es/multi-view-reconstruction/In_69.png)
resolution = ImageAdjust@ImageSaliencyFilter[imgs[[2]]];
![Click for copyable input](assets.es/multi-view-reconstruction/In_70.png)
resolutionFunction =
ListInterpolation[Transpose@Reverse@ImageData@resolution];
![Click for copyable input](assets.es/multi-view-reconstruction/In_71.png)
\[CapitalOmega] = TriangulateMesh[
ImageMesh[Erosion[mask, DiskMatrix[2]]],
MeshRefinementFunction ->
Function[{vertices, area},
area > 32 + 512 (1 - resolutionFunction @@ Mean[vertices])^6]
]
![](assets.es/multi-view-reconstruction/O_30.png)
Extrude el objeto de malla con la función de profundidad.
![Click for copyable input](assets.es/multi-view-reconstruction/In_72.png)
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
]
![](assets.es/multi-view-reconstruction/O_31.png)
Extraiga la textura de objeto de la imagen central.
![Click for copyable input](assets.es/multi-view-reconstruction/In_73.png)
texture = SetAlphaChannel[imgs[[2]], mask]
![](assets.es/multi-view-reconstruction/O_32.png)
Mapee la textura en el objeto en 3D.
![Click for copyable input](assets.es/multi-view-reconstruction/In_74.png)
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
]
![](assets.es/multi-view-reconstruction/swf_7.png)