private static void UpdateBKernel(Index2 index, ArrayView2D <float> candidates, ArrayView2D <float> psf2, ArrayView <Pixel> pixel) { var indexCandidate = index.Add(new Index2(pixel[0].X, pixel[0].Y)).Subtract(psf2.Extent / 2); if (index.InBounds(psf2.Extent) & indexCandidate.InBounds(candidates.Extent) & pixel[0].AbsDiff > 0) { candidates[indexCandidate] -= (psf2[index] * pixel[0].Sign * pixel[0].AbsDiff); } }
private static void ShrinkKernel(Index2 index, ArrayView2D <float> xImage, ArrayView2D <float> bMap, ArrayView2D <float> aMap, ArrayView <float> lambdaAlpha, ArrayView <Pixel> output) { if (index.X == 0 & index.Y == 0) { output[0].AbsDiff = 0; } if (index.InBounds(xImage.Extent)) { var xOld = xImage[index]; var gradient = bMap[index]; var lipschitz = aMap[index]; var lambda = lambdaAlpha[0]; var alpha = lambdaAlpha[1]; var xNew = GPUProximalOperator(xOld * lipschitz + gradient, lipschitz, lambda, alpha); var xAbsDiff = XMath.Abs(xNew - xOld); var xIndex = index.X; var yIndex = index.Y; var sign = XMath.Sign(xNew - xOld); var pix = new Pixel() { AbsDiff = xAbsDiff, X = xIndex, Y = yIndex, Sign = sign }; Atomic.MakeAtomic(ref output[0], pix, new MaxPixelOperation(), new PixelCompareExchange()); } }