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.
Obtenha uma máscara de objeto da imagem central.
mask = Erosion[Binarize[imgs[[2]], 0], 1];
Determine a paralaxe nas imagens da esquerda e da direita em relação ao centro da imagem.
parallaxL = First@ImageDisplacements[imgs[[{2, 1}]]];
parallaxR = First@ImageDisplacements[imgs[[{2, 3}]]];
Combine estes deslocamentos em um paralaxe total.
parallax = parallaxL - parallaxR;
Em um dado ambiente, o componente da paralaxe é aproximadamente proporcional à profundidade da respectiva fonte de pixel.
depth = Blur@
Opening[ImageMultiply[ImageAdjust@Image[parallax[[All, All, 1]]],
mask], DiskMatrix[4]]
Construa uma função de profundidade.
depthFunction = ListInterpolation[Transpose@Reverse@ImageData[depth]];
Obtenha um objeto de malha com refinamento que dependa da saliência do 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]
]
Deformação da malha objeto com a função de profundidade.
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
]
Extraia a textura do objeto da imagem central.
texture = SetAlphaChannel[imgs[[2]], mask]
Mapeie a textura no objeto em 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
]