protected override byte[] Solve(MyImageD image) { byte[] ans = new byte[image.data.Length]; double Le = 0; for (int i = 0; i < image.height; i++) { for (int j = 0; j < image.width; j++) { int k = i * image.stride + j * 4; if (!(image.data[k + 0] + image.data[k + 1] + image.data[k + 2] >= 0)) { LogPanel.Log($"Weird: {image.data[k + 0]}, {image.data[k + 1]}, {image.data[k + 2]}"); } Le += Math.Log(1 + image.data[k + 0] + image.data[k + 1] + image.data[k + 2]); } } //LogPanel.Log($"Sum of Log(Lw): {Le}"); Le = Math.Exp(Le / (image.height * image.width)); LogPanel.Log($"alpha = {alpha}, Lwhite = {Lwhite}, Le = {Le}"); for (int i = 0; i < image.height; i++) { for (int j = 0; j < image.width; j++) { int k = i * image.stride + j * 4; ans[k + 0] = HeatToByte(alpha, Le, image.data[k + 0]); ans[k + 1] = HeatToByte(alpha, Le, image.data[k + 1]); ans[k + 2] = HeatToByte(alpha, Le, image.data[k + 2]); ans[k + 3] = 255; } } return(ans); }
public MyImage(byte[] _data, MyImageD template) { data = _data; height = template.height; width = template.width; stride = template.stride; dpi_x = template.dpi_x; dpi_y = template.dpi_y; format = template.format; palette = template.palette; }
protected override byte[] Solve(MyImageD image) { byte[] ans = new byte[image.data.Length]; for (int i = 0; i < image.height; i++) { for (int j = 0; j < image.width; j++) { int k = i * image.stride + j * 4; ans[k + 0] = HeatToByte(image.data[k + 0]); ans[k + 1] = HeatToByte(image.data[k + 1]); ans[k + 2] = HeatToByte(image.data[k + 2]); ans[k + 3] = 255; } } return(ans); }
public async Task <MyImage> ProcessImage(List <MyImage> images) { HDRSolver hdr = null; foreach (var p in radio_HDR) { if (p.Key.IsChecked == true) { hdr = p.Value(); break; } } if (hdr == null) { LogPanel.Log("No HDR selected."); return(null); } ToneMappingSolver tone = null; foreach (var p in radio_ToneMapping) { if (p.Key.IsChecked == true) { tone = p.Value(); break; } } if (tone == null) { LogPanel.Log("No Tone-Mapping selected."); return(null); } return(await Task.Run(() => { LogPanel.Log("Running HDR..."); foreach (var image in images) { hdr.AddImage(image); } MyImageD heat_map = hdr.RunHDR(); LogPanel.Log("Running Tone Mapping..."); MyImage ans = tone.RunToneMapping(heat_map); LogPanel.Log("OK."); return ans; })); }
protected override byte[] Solve(MyImageD image) { double mx = double.MinValue, mn = double.MaxValue; for (int i = 0; i < image.height; i++) { for (int j = 0; j < image.width; j++) { int k = i * image.stride + j * 4; double v = Math.Log10(1 + image.data[k + 0] + image.data[k + 1] + image.data[k + 2]); if (v > mx) { mx = v; } if (v < mn) { mn = v; } } } LogPanel.Log($"min heat: {Math.Pow(10, mn).ToString("E")}"); LogPanel.Log($"max heat: {Math.Pow(10, mx).ToString("E")}"); byte[] ans = new byte[image.data.Length]; for (int i = 0; i < image.height; i++) { for (int j = 0; j < image.width; j++) { int k = i * image.stride + j * 4; double v = Math.Log10(1 + image.data[k + 0] + image.data[k + 1] + image.data[k + 2]); GetHeatColor((v - mn) / (mx - mn), out byte r, out byte g, out byte b); ans[k + 0] = b; ans[k + 1] = g; ans[k + 2] = r; ans[k + 3] = 255; } } return(ans); }
public MyImage RunToneMapping(MyImageD image) { return(new MyImage(Solve(image), image)); }
protected abstract byte[] Solve(MyImageD image);