public static async Task <InpaintingResult> InpaintImage([ActivityTrigger] NnfInputData input) { var container = BlobHelper.OpenBlobContainer(input.Container); var imageBlob = container.GetBlockBlobReference(input.Image); var image = (await BlobHelper.ConvertBlobToArgbImage(imageBlob)) .FromArgbToRgb(new[] { 0.0, 0.0, 0.0 }) .FromRgbToLab(); var inpaintAreaState = BlobHelper.ReadFromBlob <Area2DState>(input.InpaintAreaName, container); var inpaintArea = Area2D.RestoreFrom(inpaintAreaState); var nnfState = BlobHelper.ReadFromBlob <NnfState>(input.NnfName, container); var nnf = new Nnf(nnfState); nnf.Normalize(); // after we have the NNF - we calculate the values of the pixels in the inpainted area var inpaintResult = Inpaint(image, inpaintArea, nnf, input.K, input.Settings); await BlobHelper.SaveImageLabToBlob(image, container, input.Image); // TODO: remove it later it is for debug purpose. await BlobHelper.SaveImageLabToBlob(image, container, $"{input.LevelIndex}_{input.IterationIndex}.png"); return(inpaintResult); }
public static async Task CreateNnf([ActivityTrigger] NnfInputData input) { var container = BlobHelper.OpenBlobContainer(input.Container); var imageBlob = container.GetBlockBlobReference(input.Image); var imageArgb = await BlobHelper.ConvertBlobToArgbImage(imageBlob); var nnf = new Nnf(imageArgb.Width, imageArgb.Height, imageArgb.Width, imageArgb.Height, input.Settings.PatchSize); var nnfData = JsonConvert.SerializeObject(nnf.GetState()); BlobHelper.SaveJsonToBlob(nnfData, container, input.NnfName); }
public static async Task NnfInitIteration([ActivityTrigger] NnfInputData input) { var container = BlobHelper.OpenBlobContainer(input.Container); var imageBlob = container.GetBlockBlobReference(input.Image); var imageArgb = await BlobHelper.ConvertBlobToArgbImage(imageBlob); var image = imageArgb .FromArgbToRgb(new[] { 0.0, 0.0, 0.0 }) .FromRgbToLab(); var imageArea = Area2D.Create(0, 0, image.Width, image.Height); var pixelsArea = imageArea; var nnfSettings = input.Settings.PatchMatch; var calculator = input.IsCie79Calc ? ImagePatchDistance.Cie76 : ImagePatchDistance.Cie2000; var nnfState = BlobHelper.ReadFromBlob <NnfState>(input.NnfName, container); var nnf = new Nnf(nnfState); var mappingState = BlobHelper.ReadFromBlob <Area2DMapState>(input.Mapping, container); var mapping = new Area2DMap(mappingState); if (input.ExcludeInpaintArea) { var inpaintAreaState = BlobHelper.ReadFromBlob <Area2DState>(input.InpaintAreaName, container); var inpaintArea = Area2D.RestoreFrom(inpaintAreaState); pixelsArea = imageArea.Substract(inpaintArea); } var nnfBuilder = new PatchMatchNnfBuilder(); nnfBuilder.RunRandomNnfInitIteration(nnf, image, image, nnfSettings, calculator, mapping, pixelsArea); var nnfData = JsonConvert.SerializeObject(nnf.GetState()); BlobHelper.SaveJsonToBlob(nnfData, container, input.NnfName); foreach (var subNnfName in input.SplittedNnfNames) { BlobHelper.SaveJsonToBlob(nnfData, container, subNnfName); } }
public static async Task ScaleNnf([ActivityTrigger] NnfInputData input) { var container = BlobHelper.OpenBlobContainer(input.Container); var imageBlob = container.GetBlockBlobReference(input.Image); var image = (await BlobHelper.ConvertBlobToArgbImage(imageBlob)) .FromArgbToRgb(new[] { 0.0, 0.0, 0.0 }) .FromRgbToLab(); var calculator = input.IsCie79Calc ? ImagePatchDistance.Cie76 : ImagePatchDistance.Cie2000; var mappingState = BlobHelper.ReadFromBlob <Area2DMapState>(input.Mapping, container); var mapping = new Area2DMap(mappingState); var nnfState = BlobHelper.ReadFromBlob <NnfState>($"nnf{input.LevelIndex - 1}.json", container); var nnf = new Nnf(nnfState); nnf = nnf.CloneAndScale2XWithUpdate(image, image, input.Settings.PatchMatch, mapping, calculator); var nnfData = JsonConvert.SerializeObject(nnf.GetState()); BlobHelper.SaveJsonToBlob(nnfData, container, input.NnfName); }