public static bool SetBlur(this Camera camera, float value, float duration = 0f) { GaussBlur blur = camera.GetComponent <GaussBlur>(); if (blur == null) { return(false); } blur.SetEffectScale(value, duration); return(true); }
private void Draw(Bitmap bitmap, Func <float, Image> temp) { var w = (float)bitmap.Width / 2; var h = (float)bitmap.Height / 2; var r = Math.Sqrt(w * w + h * h); var уголЦентраРад = Math.Atan2(h, w); using (var graphics = CreateGraphics(bitmap)) { graphics.Clear(Color.FromArgb(0, 0, 0, 0)); for (var i = 0; i < КоличествоКопий; i++) { GaussBlur.Smooth(bitmap, Сглаживание); var angle = (float)i / КоличествоКопий; var a = НачальныйУгол + angle * (КонечныйУгол - НачальныйУгол); var уголРад = (float)(2 * Math.PI * a); var уголГрад = 360 * a; OnMessage(Math.Round(уголГрад) + "°"); var dx = r * Math.Cos(уголРад + уголЦентраРад); var dy = r * Math.Sin(уголРад + уголЦентраРад); graphics.TranslateTransform(w - (float)dx, h - (float)dy); graphics.RotateTransform(уголГрад); graphics.DrawImageUnscaled(temp(angle), 0, 0); graphics.ResetTransform(); OnPreview(); var progressEventArgs = new ProgressEventArgs(i, КоличествоКопий); OnProgress(progressEventArgs); if (progressEventArgs.Stop) { break; } } } }
unsafe public GamePostRenderer(RenderSystem rs, RtsCamera camera) { this.factory = rs.ObjectFactory; this.renderSys = rs; this.camera = camera; compEff = new Composite(rs); gaussBlur = new GaussBlur(rs); edgeEff = new EdgeDetect(rs); depthViewEff = new DepthView(rs); vtxDecl = factory.CreateVertexDeclaration(RectVertex.Elements); whitePixel = factory.CreateTexture(1, 1, 1, TextureUsage.StaticWriteOnly, ImagePixelFormat.A8R8G8B8); *(uint *)whitePixel.Lock(0, LockMode.None).Pointer.ToPointer() = 0xffffffff; whitePixel.Unlock(0); LoadUnmanagedResources(); }
public static short[,] Apply(CTSliceInfo ct, GaussBlur gb) { short[,] hmap = ct.HounsfieldPixelBuffer; int nr = ct.RowCount; int nc = ct.ColumnCount; int br = gb.br; int bc = gb.bc; float[,] blur = gb.blur; short[,] bm = new short[nr, nc]; int l = bm.Length; Array.Clear(bm, 0, bm.Length); for (int r = br; r != nr-br; ++r) { for (int c = bc; c != nc-bc; ++c) { float s = 0.0f; for (int ir = -br; ir <= br; ++ir) { int sr = r + ir; for (int ic = -bc; ic <= bc; ++ic) { int sc = c + ic; s += (float)hmap[sr, sc] * blur[ir + br, ic + bc]; } } bm[r, c] = (short)(s + 0.5f); } } return bm; }
private void ButtonLungs_Click(object sender, RoutedEventArgs e) { bool rc = _scol.BuildSortedSlicesArray(); if (!rc) { System.Windows.MessageBox.Show("There are skips in CTs!"); return; } CTSliceInfo[] slices = _scol.Slices; // Step 1: find the couch int sr = SelectStartSlice(slices); CTSliceInfo ct = slices[sr]; int sc = Couch.DetectCouchInOneSlice(ct.HounsfieldPixelBuffer, ct.RowCount, ct.ColumnCount); int scBefore = Couch.DetectCouchInOneSlice(slices[sr + 10].HounsfieldPixelBuffer, slices[sr + 10].RowCount, slices[sr + 10].ColumnCount); int scAfter = Couch.DetectCouchInOneSlice(slices[sr - 10].HounsfieldPixelBuffer, slices[sr - 10].RowCount, slices[sr - 10].ColumnCount); sc = Math.Max(Math.Max(sc, scBefore), scAfter); // Step 2: Gaussian blur GaussBlur gb = new GaussBlur((float)ct.PixelSpacing_X, (float)ct.PixelSpacing_X, 5); for (int k = 0; k != slices.Length; ++k) { ct = slices[k]; short[,] bm = CTSliceHelpers.Apply(ct, gb); ct.HounsfieldPixelBuffer = bm; } // Step 3: clear below the couch for (int k = 0; k != slices.Length; ++k) { ct = slices[k]; short[,] hb = ct.HounsfieldPixelBuffer; for (int r = ct.RowCount - 1; r > sc; --r) { for (int c = 0; c != ct.ColumnCount; ++c) { hb[r, c] = -1024; } } } // Step 4: gray level thresholding for (int k = 0; k != slices.Length; ++k) { ct = slices[k]; Couch.GLThresholding(ct, sc, -499, 0, -499); } // Step 5: Flool fill for (int k = 0; k != slices.Length; ++k) { ct = slices[k]; short[,] ret = Couch.FloodFill(ct.HounsfieldPixelBuffer, ct.RowCount, ct.ColumnCount, 3, 3, -499, 0); ct.HounsfieldPixelBuffer = ret; } // Step 6: Contours via Moore Neighbour for (int k = slices.Length - 1; k >= slices.Length - 2; --k) { ct = slices[k]; int nr = ct.RowCount; int nc = ct.ColumnCount; int z = ct.SliceLoc; double zz = ct.UpperLeft_Z; short[,] bm = ct.HounsfieldPixelBuffer; bool[,] image = new bool[nr, nc]; for (int r = 0; r != nr; ++r) { for (int c = 0; c != nc; ++c) { image[r, c] = false; if (bm[r, c] < 0) { image[r, c] = true; } } } System.Drawing.Point[] contour = MooreContour.Trace(image, nr, nc); foreach (var pt in contour) { int r = pt.Y; int c = pt.X; bm[r, c] = 500; } } }