470 likes | 606 Views
Térfogatvizualizáció. Szirmay-Kalos László. Térfogati modellek (skalár mezők). 3D tér pontjaiban egy skalár érték. v ( x,y,z ). v ( x,y,z ). z. y. x. Skalár: hőmérséklet, sűrűség nyomás, potenciál, … Származás: Euler-i szimuláció, Rekonstrukció (tomográfia).
E N D
Térfogatvizualizáció Szirmay-Kalos László
Térfogati modellek (skalár mezők) 3D tér pontjaiban egy skalár érték v(x,y,z) v(x,y,z) z y x • Skalár: hőmérséklet, sűrűség • nyomás, potenciál, … • Származás: Euler-i szimuláció, • Rekonstrukció (tomográfia) tárolás: 3D textúra vagy „voxel tömb”
Térfogati modell megjelenítése Kép szintézis • Megjelenítés fényszóró anyag (participating media) analógiáját felhasználva (belsejébe belelátunk) • Adott szintfelület kiemelése (külsőt lehámozzuk) Transzfer függvény grad v Hesse v Kép Optikai paraméterek Sűrűség + deriváltak
Fényszóró közeg ds Hatáskeresztmetszet, alias kioltási tényező ·ds = P(ütközés) A=1 • Albedo a: a nem-elnyelődés valószínűsége feltéve, hogy az ütközés bekövetkezett • Fekete test: albedo= 0
ds Sugársűrűség változása s L(s+ds) L(s) // Kiszóródás+abszorbció // Emisszió // Beszóródás L(s+ds)= L(s) – L(s)·(s)·ds + Le(s)·ds + (s)·a(s)·ds·f(‘,)Li(‘)d‘ dL(s)/ds= –L(s)·(s)+Le(s)+Linscatter(s) Megoldás fényelnyelő közegre (emisszió és beszóródás nincs): L(s)= L(0)·exp(–s (s)ds)
Szóródás x E’ Klein-Nishina: Szóródott foton Érkező foton φ z ütközés E y Rayleigh: Compton formula:
Sugár masírozás (raymarching) Megoldás: dL(s)/ds= –L(s)·(s)+Le(s)+Linscatter(s) L(s + s) L(s) L(0) s L(s+s) = L(s) – L(s)·(s)·s + (Le(s) + Linscatter(s))·s (s) C(s) opacitás hozzájárulás L(s+s) = (1 –(s)) · L(s)+ C(s) átlátszóság
Back-to-frontraymarching L(s+s) = (1 –(s)) · L(s)+ C(s) C(s), (s)) s=0 L = L0; for(s = 0; s < T; s += s) { L = (1 –(s)) · L + C(s); }
Front-to-backraymarching L*(s) (s) L*(ss)=L*(s)+(1(s)) · C(s) (ss)=((s)) · ((s)) L* 0; for( s T; s >0 ; s-=s ) { L* + (1) · C(s); (1) · ((s)); if (break; }
Voxel szín és opacitás: Transferfunc: (C,)=T(v függv)·s • Röntgen: (C,)=T(v(x,y,z))·s • opacitás = v(x,y,z)·s • L(0) = I, egyébként C(s)=0 • Klasszikus árnyalási modellek • opacitás: v osztályozása • C = árnyalási modell (diffúz + Phong) • normál = grad v • opacitás *= | grad v | • Magasabb rendű derivált (görbület) • Transzlucens anyagok (subsurface scattering) grad v
(C,) = T(v)·s • = pow(v/vmax, aexp)·s • C = HLS((v/vmax+rot)·360, 0.5, 1)·s
Klasszikus BRDF modellek First hit ray casting: Diffúz+Phong árnyalás v két osztályba: kék-átlátszó, sárga-átlátszatlan Csont : 1, másé 0 Csont =1, másé=0 Hús =1, másé=0
Transzlucens megjelenítés Felező vektor
Marchingcubes 6 2 5 1 v(x,y,z) > szint 3 7 v(x,y,z) < szint 0 4 0 0; Eset: 000011102 =14 14 2; 0-1;0-3;2-6; 0-3; 3-7; 2-6 14 255 0;
Szintérték = 110 Masírozó kockák Szintérték = 60
First hit (isosurface) raycasting v(x,y,z) > szint normal = grad v v(x,y,z) < szint
GPU first hit ray-casting up right lookat v(x,y,z) eye p q entry exit p = lookat + Xright + Yup X, Y in [-1,1] Egység kocka 3D textúrával
CPU first hit ray-casting Full screen quad For each pixel Find pixel center p raydir = normalize(p – eye); Find exit and entry for(t = entry; t < exit; t+=dt) { q = eye + raydir * t; if (volume[q] > isovalue) break; } normal vector estimation; illumination } Interpolation from the corners central differences
GPU Isosurface ray-casting volume eye, isolevel, material/light properties Ray casting Pixel shader CPU program Vertex shader Rasterization Interpolation Vertices of the window quad ray/window hpos=fullscreen textcoords Volume
CPU program - OpenGL display void Display( ) { // PASS: non uniform parameters glBegin( GL_QUADS ); Vector p = lookat - Right + Up; glTexCoord3f(p.x, p.y. p.z); glVertex3f(-1, 1, 0); p = lookat - Right - Up; glTexCoord3f(p.x, p.y. p.z); glVertex3f(-1, -1, 0); p = lookat + Right - Up; glTexCoord3f(p.x, p.y. p.z); glVertex3f(1, -1, 0); p = lookat + Right + Up; glTexCoord3f(p.x, p.y. p.z); glVertex3f(1, 1, 0); glEnd(); } Camera window as texture coordinates Full screen quad
Ray casting: vertexshader voidVertexShader( in float4 hPosIn : POSITION, in float3 wPosIn : TEXCOORD0, out float4 hPosOut : POSITION, out float3 wPosOut : TEXCOORD0 ) { hPosOut =hPosIn; wPosOut = wPosIn; }
Ray casting: fragment shader void FragmentShader( in float3 p : TEXCOORD0,// point on window uniform float3 eye, uniform sampler3D volume, // voxels uniform float isolevel, uniform float3 lightdir, lightint, kd out float3color : COLOR ) { float3 raydir = normalize(p – eye); float3 t0 = (float3(0,0,0)-eye)/raydir; float3 t1 = (float3(1,1,1)-eye)/raydir; float3 ti = min(t0, t1); float3 to = max(t0, t1); float entry = max(max(ti.x, ti.y), ti.z); float exit = min(min(to.x, to.y), to.z); color = float(0, 0, 0); bool found = (exit <= entry); cont’d… t1.x t1.y ti.yto.y 1 t0.x ti.xto.x t0.y 0 0 1
Ray castingfragment shader cont’d if ( !found ) { float3 q, normal; float dt = (exit – entry) / STEPS; for(t= entry; t < exit; t += dt) { if ( !found ) { q = eye + raydir * t; if (tex3D(volume, q).r > isolevel) found = true; } } if ( found ) { normal.x =tex3d(volume, q + float3(1/RES,0,0)) – tex3d(volume, q - float3(1/RES,0,0)); normal.y = tex3d(volume, q + float3(0,1/RES,0)) – tex3d(volume, q - float3(0,1/RES,0)); normal.z = tex3d(volume, q + float3(0,0,1/RES)) – tex3d(volume, q - float3(0,0,1/RES)); normal = normalize( normal ); color = lightint * kd * max(dot(lightdir, normal), 0); } } } q
Tomográfia Abszorpciós Emissziós LOR L(s)= L(0)·exp(–(s)ds) (s)ds = – log(L(s)/L(0)) L(s)=Le(s)ds
X-rayComputedTomography Forgatás Detektorok X-ray forrás (CRT) sugarak
Szűrt visszavetítés (FBP=Filtered backprojection) Súlyfüggvény: w(x,y)=w(r) 1/r i(x,y)=(x,y) Mérés + Visszavetítés Rkör: rd • w(x,y)dxdy=2Rw(r)rdrd= • =2Rw(r)rdr R dr r Korrekció Fourier térben: o(x,y)=i(x,y)w(x,y) FxFy o[x,y] = FxFy i[x,y]FxFyw[x,y] Rámpa szűrő 1/|| FxFy i[x,y] = FxFy o[x,y] ||
Zaj! Becsapódások véletlen események! Emissziós tomográfia: Poisson eloszlás 0 1 2 Nagy számok törvénye?
Algebraivisszavetítés Lin egyenlet (V<D): d= Av, d = [d1,..., dD] v = [v1,..., vV] Moore féle pseudo-inverz: AT d= ATA v v = (ATA)-1AT d =A+d (D×V) (D) (V) v1 v2 d4 v3 v4 d3 d2 (V×D) (D) (V×V) d1 = A11v1 +A13v3
ExpectationMaximization Véletlen mérési folyamat Aktivitás: v eredmény: d Mi a v ha tudjuk d-t? • Amelyik éppen a mérési eredményt maximálja P(d|v) • Likelihood maximalizálás: logP • Előny: a mérés statisztikai modelljét is figyelembe veszi
PET: iteratív séma Poisson és pozitivitási kényszer LOR L : annak valószínűsége, hogy a V voxelben bekövetkezett bomlást az L LOR detektálja voxel V
Iteratív séma Skalármező Projekció Összevetés a mért értékekkel Skalármező korrekciója
Ill-posed: nincs megoldás vagy nem egyértelmű. Nem ismerjük n-et (zaj). Közelítő megoldásokból melyik (zaj hatása)? Plusz információ bevitele: regularizáció Inverz problémák Projekció (Tomográf) Aktivitás eloszlás Beütések száma a detektorokban
Megoldási sémák Algebrai Valószínűségi 2-es norma Kullback-Leibler divergencia y Gauss eloszlású y Poisson eloszlású
R(x) „rossz” megoldásoknál nagy, „jó” megoldásoknál kicsi (tökéletes megoldást ne büntesd, de nem ismerjük), konvex függvény. Teljes variáció (TV): Regularizáció Likelihood Regularizációs paraméter Zajos megoldások büntetése
PET P P N e+ e- Line Of Response (LOR)
Nincs szóródás 324×315×315 voxels
Positron range Nélküle Vele
Szóródás a testben Nélküle Vele
Szóródás a detektorban … 324×315×315 resolution 3382 x 845 res <0.1 mm voxels + scattering in detectors With