Wolfram Language

Procesamiento de imágenes y señales

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.

In[1]:=
Click for copyable input

Obtenga una máscara de objeto de la imagen central.

In[2]:=
Click for copyable input
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.

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

Combine estos desplazamientos en un paralaje total.

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

En un entorno dado, el componente x del paralaje es aproximadamente proporcional a la profundidad de la fuente de pixel correspondiente.

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

Construya una función de profundidad.

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

Obtenga un objeto de malla con refinamiento que dependa de la prominencia del objeto.

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]=

Extrude el objeto de malla con la función de profundidad.

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]=

Extraiga la textura de objeto de la imagen central.

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

Mapee la textura en el objeto en 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 ]
Reproducir
Detener

Ejemplos relacionados

de en fr ja ko pt-br ru zh