public static unsafe void FindMinimum(this IReadOnlyImageFloat <MonoImageType> @this, Box2i box, out Vector2i location, out float value) { value = float.PositiveInfinity; location = new Vector2i(); var step = @this.Step; using (var pin = @this.Open()) { var ptr = pin.Ptr + box.MinCorner * step; for (var j = box.MinY; j <= box.MaxY; j++) { var pixelPtr = ptr; for (var i = box.MinX; i <= box.MaxX; i++) { if (*pixelPtr < value) { location = new Vector2i(i, j); value = *pixelPtr; } pixelPtr += step.X; } ptr += step.Y; } } }
public PinnedFloatBuffer Open() { var data = _image.Open(); data.MoveOffset(_image.Step * _viewTopLeft); return(data); }
public static unsafe IImageFloat <TType> Divide <TType>(this IReadOnlyImageFloat <TType> @this, float x) where TType : IImageType, new() { var answer = new ImageFloat <TType>(@this.Dimensions); var inStep = @this.Step; var outStep = answer.Step; var dimensions = @this.Dimensions; var channelsCount = Singleton <TType> .Instance.ChannelsCount; using (var pinInput = @this.Open()) { using (var pinOutput = answer.Open()) { var inPtr = pinInput.Ptr; var outPtr = pinOutput.Ptr; for (var j = 0; j < dimensions.Y; j++) { var inPixelPtr = inPtr; var outPixelPtr = outPtr; for (var i = 0; i < dimensions.X; i++) { for (var c = 0; c < channelsCount; c++) { outPixelPtr[c] = inPixelPtr[c] / x; } inPixelPtr += inStep.X; outPixelPtr += outStep.X; } inPtr += inStep.Y; outPtr += outStep.Y; } } } return(answer); }
public unsafe static IImageFloat <TType> HorizontalConvolution <TType> (this IReadOnlyImageFloat <TType> @this, float *kernel, int leftOffset, int rightOffset) where TType : IImageType, new() { ArgAssert.AtLeast(leftOffset, "leftOffset", 0); ArgAssert.AtLeast(rightOffset, "rightOffset", 0); var answer = new ImageFloat <TType>(@this.Dimensions); var channelsCount = Singleton <TType> .Instance.ChannelsCount; using (var pinInput = @this.Open()) { var inPtr = pinInput.Ptr; using (var pinOutput = answer.Open()) { var outPtr = pinOutput.Ptr; for (var j = 0; j < @this.Dimensions.Y; j++) { var inPixelPtr = inPtr; var outPixelPtr = outPtr; for (var i = 0; i < @this.Dimensions.X; i++) { int k = -leftOffset; var kernelPtr = kernel; for (; k < -i; k++) { for (var c = 0; c < channelsCount; c++) { outPixelPtr[c] += *kernelPtr * inPtr[c]; } kernelPtr++; } var rightBound = Math.Min(@this.Dimensions.X - i - 1, rightOffset); var windowPtr = inPixelPtr + @this.Step.X * k; for (; k < rightBound; k++) { for (var c = 0; c < channelsCount; c++) { outPixelPtr[c] += *kernelPtr * windowPtr[c]; } kernelPtr++; windowPtr += @this.Step.X; } for (; k <= rightOffset; k++) { for (var c = 0; c < channelsCount; c++) { outPixelPtr[c] += *kernelPtr * windowPtr[c]; } kernelPtr++; } inPixelPtr += @this.Step.X; outPixelPtr += answer.Step.X; } inPtr += @this.Step.Y; outPtr += answer.Step.Y; } } } return(answer); }