Wolfram Language

Processamento de imagens e sinais

Reconstrução por meio de múltiplas perspectivas

Um objeto 3D pode ser reconstruído a partir de múltiplas vistas em 2D. ImageDisplacements é utilizada para determinar a paralaxe de uma vista para outra. Quanto maior o deslocamento de paralaxe, mais próximo está o objeto atrás do pixel correspondente. Com esta informação de profundidade, você pode extrudir os vértices de um objeto de malha obtido através de ImageMesh e TriangulateMesh. O resultado é mostrado através de um mapeamento de textura no objeto de malha em 3D.

In[1]:=
Click for copyable input

Obtenha uma máscara de objeto da imagem central.

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

Determine a paralaxe nas imagens da esquerda e da direita em relação ao centro da imagem.

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 estes deslocamentos em um paralaxe total.

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

Em um dado ambiente, o componente x da paralaxe é aproximadamente proporcional à profundidade da respectiva fonte de pixel.

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

Construa uma função de profundidade.

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

Obtenha um objeto de malha com refinamento que dependa da saliência do 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]=

Deformação da malha objeto com a função de profundidade.

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

Extraia a textura do objeto da imagem central.

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

Mapeie a textura no objeto em 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 ]
Reproduzir
Parar

Exemplos Relacionados

de en es fr ja ko ru zh