Rekonstruktion aus unterschiedlichen Bildansichten
Ein 3D-Objekt kann auf der Grundlage unterschiedlicher 2D-Ansichten rekonstruiert werden. ImageDisplacements kann verwendet werden, um die Parallaxe zwischen zwei aufeinanderfolgenden Ansichten zu bestimmen. Je größer die Parallaxenverschiebung, umso näher erscheint das Objekt hinter dem entsprechenden Pixel. Mit dieser Information zur Tiefe können Sie die Gitternetzkanten eines Objekts, das durch ImageMesh und TriangulateMesh erzeugt wurde, ausfüllen. Das Ergebnis wird durch Anwendung von Texture-Mapping auf das 3D-Gitternetzobjekt veranschaulicht.
![Click for copyable input](assets.de/multi-view-reconstruction/In_62.png)
Erstellen Sie eine Maske des mittleren Bilds.
![Click for copyable input](assets.de/multi-view-reconstruction/In_63.png)
mask = Erosion[Binarize[imgs[[2]], 0], 1];
Bestimmen Sie die Parallaxe im linken und rechten Bild in Bezug auf das mittlere Bild.
![Click for copyable input](assets.de/multi-view-reconstruction/In_64.png)
parallaxL = First@ImageDisplacements[imgs[[{2, 1}]]];
![Click for copyable input](assets.de/multi-view-reconstruction/In_65.png)
parallaxR = First@ImageDisplacements[imgs[[{2, 3}]]];
Kombinieren Sie diese Verschiebungen zu einer Gesamtparallaxe.
![Click for copyable input](assets.de/multi-view-reconstruction/In_66.png)
parallax = parallaxL - parallaxR;
Im gegebenen Setting ist die -Komponente der Parallaxe annähernd proportional zur Tiefe der entsprechenden Pixelquelle.
![Click for copyable input](assets.de/multi-view-reconstruction/In_67.png)
depth = Blur@
Opening[ImageMultiply[ImageAdjust@Image[parallax[[All, All, 1]]],
mask], DiskMatrix[4]]
![](assets.de/multi-view-reconstruction/O_29.png)
Erstellen Sie eine Tiefenfunktion.
![Click for copyable input](assets.de/multi-view-reconstruction/In_68.png)
depthFunction = ListInterpolation[Transpose@Reverse@ImageData[depth]];
Erstellen Sie ein Gitternetz des Objekts mit Netzverfeinerung abhängig von der Salienz des Objekts.
![Click for copyable input](assets.de/multi-view-reconstruction/In_69.png)
resolution = ImageAdjust@ImageSaliencyFilter[imgs[[2]]];
![Click for copyable input](assets.de/multi-view-reconstruction/In_70.png)
resolutionFunction =
ListInterpolation[Transpose@Reverse@ImageData@resolution];
![Click for copyable input](assets.de/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.de/multi-view-reconstruction/O_30.png)
Füllen Sie das Gitternetz mit der Tiefenfunktion auf.
![Click for copyable input](assets.de/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.de/multi-view-reconstruction/O_31.png)
Extrahieren Sie die Beschaffenheit des Objekts aus dem mittleren Bild.
![Click for copyable input](assets.de/multi-view-reconstruction/In_73.png)
texture = SetAlphaChannel[imgs[[2]], mask]
![](assets.de/multi-view-reconstruction/O_32.png)
Übertragen Sie die Oberflächenbeschaffenheit auf das 3D-Objekt.
![Click for copyable input](assets.de/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.de/multi-view-reconstruction/swf_7.png)