public static PixelData GetOutLinePixelData(PixelData pixels, float distance, bool isHSB = false) { Func <Color, Color, float, bool> CompareColor = (Color c1, Color c2, float d) => { return(isHSB ? CompareBaseHSB(c1, c2, d) : CompareBaseRGB(c1, c2, d)); }; Func <Color, Color, bool> CompareColorExtra = (Color c1, Color c2) => { return(isHSB ? c1.GetBrightness() - c2.GetBrightness() > 0 : GetGrayOfColor(c1) - GetGrayOfColor(c2) > 0); }; var colors = pixels.GetColorsClone(); Color color1, color2; for (var i = 1; i <= pixels.Width - 2; i++) { for (var j = 1; j <= pixels.Height - 2; j++) { color1 = pixels.Colors[i, j]; for (var p = 0; p <= 3; p++) { color2 = pixels.Colors[i + OffsetX[p], j + OffsetY[p]]; if (!CompareColor(color1, color2, distance) && CompareColorExtra(color1, color2)) { colors[i, j] = Color.Black; } else { colors[i, j] = Color.White; } } } } return(PixelData.CreateFromColors(colors)); }
public static PixelData GetLumpPixelData(PixelData pixels, int range = 10) { Color[,] colors = pixels.GetColorsClone(); for (var i = 0; i <= pixels.Width - 1; i++) { for (var j = 0; j <= pixels.Height - 1; j++) { var r = (colors[i, j].R / range) * range; var g = (colors[i, j].G / range) * range; var b = (colors[i, j].B / range) * range; colors[i, j] = Color.FromArgb(r, g, b); } } return(PixelData.CreateFromColors(colors)); }
public static PixelData GetThresholdPixelData(PixelData pixels, float threshold, bool isHSB = false) { Color[,] colors = pixels.GetColorsClone(); Func <Color, bool> IsOverThreshold = (Color color) => { return(isHSB ? (color.GetHue() / 360 + color.GetBrightness() + color.GetSaturation()) / (double)3 < threshold : GetGrayOfColor(color) < threshold); }; for (var i = 0; i <= pixels.Width - 1; i++) { for (var j = 0; j <= pixels.Height - 1; j++) { colors[i, j] = IsOverThreshold(colors[i, j]) ? Color.Black : Color.White; } } return(PixelData.CreateFromColors(colors)); }
public static int[,] GetPixelDataBools(PixelData pixels) { int[,] result = new int[pixels.Width - 1 + 1, pixels.Height - 1 + 1]; Color[,] colors = pixels.GetColorsClone(); for (var i = 0; i <= pixels.Width - 1; i++) { for (var j = 0; j <= pixels.Height - 1; j++) { if (colors[i, j].Equals(Color.FromArgb(255, 255, 255))) { result[i, j] = 0; } else { result[i, j] = 1; } } } return(result); }
public static PixelData GetInvertPixelData(PixelData pixels) { var colors = pixels.GetColorsClone(); int[,] bools = GetPixelDataBools(pixels); for (var i = 0; i <= pixels.Width - 1; i++) { for (var j = 0; j <= pixels.Height - 1; j++) { if (bools[i, j] == 0) { colors[i, j] = Color.Black; } else { colors[i, j] = Color.White; } } } return(PixelData.CreateFromColors(colors)); }
public static PixelData Solve(PixelData pixels) { int[,] bools = ColorHelper.GetPixelDataBools(pixels); int[,] iThin = bools.Clone() as int[, ]; Color[,] colors = pixels.GetColorsClone(); int w = pixels.Width; int h = pixels.Height; for (var i = 0; i < h; i++) { for (var j = 0; j < w; j++) { if (bools[j, i] == 1) { int sum = 0; int[] a = { 1, 1, 1, 1, 1, 1, 1, 1, 1 }; for (int m = 0; m < 3; m++) { for (int n = 0; n < 3; n++) { int ry = i - 1 + m; int rx = j - 1 + n; if (-1 < rx && rx < w && -1 < ry && ry < h && iThin[rx, ry] == 1) { a[m * 3 + n] = 0; } } } sum = a[0] * 1 + a[1] * 2 + a[2] * 4 + a[3] * 8 + a[5] * 16 + a[6] * 32 + a[7] * 64 + a[8] * 128; iThin[j, i] = 1 - ThinMap[sum]; colors[j, i] = iThin[j, i] == 1 ? Color.Black : Color.White; } } } return(PixelData.CreateFromColors(colors)); }