/// <summary> /// Process analysis result, downscaling and post-processing it, preparing the texture to be written to the grid /// </summary> /// <param name="analysisResult">Analysis result texture</param> /// <returns></returns> private Texture2D ProcessAnalysisResult(Texture2D analysisResult) { //Downscale the analysis result TextureScale.Point(analysisResult, 64, 64); //string folder = @"D:\GitRepo\PublicParts\PP_AI_Studies\temp_en\helpers\"; //ImageReadWrite.SaveImage2Path(analysisResult, folder + "p2pdownscaledOutput"); //Create new texture with the same size as the original grid Texture2D resultGridTexture = new Texture2D(Size.x, Size.z); //Write result to texture for (int i = 0; i < resultGridTexture.width; i++) { for (int j = 0; j < resultGridTexture.height; j++) { int x = i; int y = analysisResult.height - resultGridTexture.height + j; resultGridTexture.SetPixel(i, j, analysisResult.GetPixel(x, y)); } } resultGridTexture.Apply(); //ImageReadWrite.SaveImage2Path(resultGridTexture, folder + "p2pcroppedOutput"); //Return post-processed texture return(PP_ImageProcessing.PostProcessImageFromTexture(resultGridTexture)); }
/// <summary> /// Process analysis result, downscaling and post-processing it, preparing the texture to be written to the grid /// </summary> /// <param name="analysisResult">Analysis result texture</param> /// <returns></returns> private Texture2D ProcessAnalysisResult(Texture2D analysisResult) { //Downscale the analysis result TextureScale.Point(analysisResult, 64, 64); //Create new texture with the same size as the original grid Texture2D resultGridTexture = new Texture2D(_gridSize.x, _gridSize.z); //Write result to texture for (int i = 0; i < resultGridTexture.width; i++) { for (int j = 0; j < resultGridTexture.height; j++) { int x = i; int y = analysisResult.height - resultGridTexture.height + j + 1; resultGridTexture.SetPixel(i, j, analysisResult.GetPixel(x, y)); } } resultGridTexture.Apply(); //Return post-processed texture return(PP_ImageProcessing.PostProcessImageFromTexture(resultGridTexture)); }
/// <summary> /// Generates a texture from the grid, resized properly. This method it targeted to the original dataset, /// that had the error caused by the buggy resize, requiring the external resizing to be applied /// </summary> /// <param name="grid">The source <see cref="VoxelGrid"/></param> /// <returns>The result <see cref="Texture2D"/></returns> public static Texture2D TextureFromGridOriginal(VoxelGrid grid) { string folder = @"D:\GitRepo\PublicParts\PP_AI_Studies\temp_en"; var textureFormat = TextureFormat.RGB24; Vector2Int size = new Vector2Int(grid.Size.x, grid.Size.z); //Image with extra border +1 to avoid the resizing cut problem Texture2D gridImage = new Texture2D(size.x + 1, size.y + 1, textureFormat, true, true); //Texture2D gridImage = new Texture2D(size.x, size.y); for (int i = 0; i < gridImage.width; i++) { for (int j = 0; j < gridImage.height; j++) { Color c; if (i == 0 || j == gridImage.height - 1) { c = Color.green; } else { var voxel = grid.Voxels[i - 1, 0, j]; c = !voxel.IsActive || voxel.IsOccupied ? Color.black : Color.white; } gridImage.SetPixel(i, j, c); } } gridImage.Apply(); ////Construct the resulting resized image ////Scale image up, multiplying by 4 //TextureScale.Point(gridImage, gridImage.width * 4, gridImage.height * 4); //Texture2D resultImage = new Texture2D(256, 256, textureFormat, true, true); ////Texture2D resultImage = new Texture2D(256, 256); ////Set all pixels to gray //Color[] grayPixels = new Color[256 * 256]; //var gray = Color.gray; //for (int i = 0; i < grayPixels.Length; i++) //{ // grayPixels[i] = gray; //} //resultImage.SetPixels(grayPixels); //resultImage.Apply(); ////Write grid image on result image //for (int i = 0; i < gridImage.width; i++) //{ // for (int j = 0; j < gridImage.height; j++) // { // int x = i; // int y = resultImage.height - gridImage.height + j; // resultImage.SetPixel(x, y, gridImage.GetPixel(i, j)); // } //} //resultImage.Apply(); //temporarily save image to ensure encoding string path = folder + "/temp.png"; using (MemoryStream memory = new MemoryStream()) { using (FileStream fs = new FileStream(path, FileMode.Create, FileAccess.ReadWrite)) { byte[] data = gridImage.EncodeToPNG(); fs.Write(data, 0, data.Length); } } //External resize and enlarging PP_ImageProcessing.ResizeAndFitCanvas(folder, "4", "256", "256"); //ImageReadWrite.SaveImage2Path(gridImage, folder + @"\helpers\firstOutput"); //Read externally resized image Texture2D image = new Texture2D(256, 256, textureFormat, true, true); byte[] imageData = File.ReadAllBytes(path); image.LoadImage(imageData); //UnityEngine.Debug.Log(image.width); return(image); }
public static Texture2D ReadWriteAI(VoxelGrid grid, string prefix) { string folder = @"D:\GitRepo\PublicParts\PP_AI_Studies\temp_sr"; string fileName = folder + @"\" + prefix; Vector2Int size = new Vector2Int(grid.Size.x, grid.Size.z); Texture2D outputImage = new Texture2D(size.x, size.y); for (int i = 0; i < size.x; i++) { for (int j = 0; j < size.y; j++) { var voxel = grid.Voxels[i, 0, j]; Color c = !voxel.IsActive || voxel.IsOccupied ? Color.black : Color.white; outputImage.SetPixel(i, j, c); } } outputImage.Apply(); //Clean folder before writing var dir = new DirectoryInfo(folder); foreach (FileInfo file in dir.GetFiles("*.png")) { file.Delete(); } //Write file to temp path string path = fileName + ".png"; using (MemoryStream memory = new MemoryStream()) { using (FileStream fs = new FileStream(path, FileMode.Create, FileAccess.ReadWrite)) { byte[] data = outputImage.EncodeToPNG(); fs.Write(data, 0, data.Length); } } //File.WriteAllBytes(path, data); //string editFolder = _folder + @"\Assets\Resources\temp_sr"; // Post process source PP_ImageProcessing.ResizeAndFitCanvas(folder, "4", "256", "256"); //Send to Pix2Pix python script PP_ImageProcessing.AnalysePix2PixPython(folder); //Post process step 1: resize PP_ImageProcessing.RestoreOriginalSize(folder); //Post process step 2: analyse pixels pass 1 var postprocessd = PP_ImageProcessing.PostProcessImageFromFolder(folder); //Post process step 3: analyse pixels pass 2 postprocessd = PP_ImageProcessing.PostProcessImageFromFolder(folder); //Stop stopwatch //stopwatch.Stop(); //var time = stopwatch.ElapsedMilliseconds; //UnityEngine.Debug.Log($"Time taken to process AI = {time} ms"); return(postprocessd); }