Wolfram Language

Bild- und Signalverarbeitung

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.

In[1]:=
Click for copyable input

Erstellen Sie eine Maske des mittleren Bilds.

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

Bestimmen Sie die Parallaxe im linken und rechten Bild in Bezug auf das mittlere Bild.

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

Kombinieren Sie diese Verschiebungen zu einer Gesamtparallaxe.

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

Im gegebenen Setting ist die x-Komponente der Parallaxe annähernd proportional zur Tiefe der entsprechenden Pixelquelle.

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

Erstellen Sie eine Tiefenfunktion.

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

Erstellen Sie ein Gitternetz des Objekts mit Netzverfeinerung abhängig von der Salienz des Objekts.

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

Füllen Sie das Gitternetz mit der Tiefenfunktion auf.

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

Extrahieren Sie die Beschaffenheit des Objekts aus dem mittleren Bild.

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

Übertragen Sie die Oberflächenbeschaffenheit auf das 3D-Objekt.

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 ]
Animation abspielen
Abspielung unterbrechen

Verwandte Beispiele

en es fr ja ko pt-br ru zh