public Color3(LabColor color) { this.A = color.L; this.B = color.A; this.C = color.B; this.Count = 1; }
public static double diff(Color color1, Color color2) { LabColor lab1 = LabColorTransform.RgbToLab(color1); LabColor lab2 = LabColorTransform.RgbToLab(color2); return(Math.Sqrt((lab2.L - lab1.L) * (lab2.L - lab1.L) + (lab2.A - lab1.A) * (lab2.A - lab1.A) + (lab2.B - lab1.B) * (lab2.B - lab1.B))); }
public int AddColor(Color color) { int rgb = (color.ToArgb() & 0xffffff); LabColor lab = ColorTransform.RgbToLab(color); using (SqlConnection conn = this.GetConnection()) { SqlCommand cmd = new SqlCommand("UP_ADD_COLOR", conn); cmd.CommandType = System.Data.CommandType.StoredProcedure; cmd.Parameters.Add("@rgb", System.Data.SqlDbType.Int).Value = rgb; cmd.Parameters.Add("@l", System.Data.SqlDbType.Float).Value = Math.Round(lab.L, 6); cmd.Parameters.Add("@a", System.Data.SqlDbType.Float).Value = Math.Round(lab.A, 6); cmd.Parameters.Add("@b", System.Data.SqlDbType.Float).Value = Math.Round(lab.B, 6); cmd.Parameters.Add("@l_hash", System.Data.SqlDbType.Int).Value = lab.HashL; cmd.Parameters.Add("@a_hash", System.Data.SqlDbType.Int).Value = lab.HashA; cmd.Parameters.Add("@b_hash", System.Data.SqlDbType.Int).Value = lab.HashB; cmd.ExecuteNonQuery(); cmd = null; } return(rgb); }
public static XyzColor LabToXyz(LabColor lab) { double var_Y = (lab.L + 16f) / 116f; double var_X = lab.A / 500f + var_Y; double var_Z = var_Y - lab.B / 200f; if (Math.Pow(var_Y, 3f) > 0.008856f) { var_Y = Math.Pow(var_Y, 3f); } else { var_Y = (var_Y - 16f / 116f) / 7.787f; } if (Math.Pow(var_X, 3f) > 0.008856f) { var_X = Math.Pow(var_X, 3f); } else { var_X = (var_X - 16f / 116f) / 7.787f; } if (Math.Pow(var_Z, 3f) > 0.008856f) { var_Z = Math.Pow(var_Z, 3f); } else { var_Z = (var_Z - 16f / 116f) / 7.787f; } return(new XyzColor(ref_X * var_X, //ref_X = 95.047 Observer= 2°, Illuminant= D65 ref_Y * var_Y, //ref_Y = 100.000 ref_Z * var_Z)); //ref_Z = 108.883 }
public double Distance(LabColor x) { float l = this.L - x.L; float a = this.A - x.A; float b = this.B - x.B; return(Math.Sqrt((l * l) + (a * a) + (b * b))); }
public RawImage Resample(int factor) { switch (factor) { case 2: case 3: case 4: break; default: throw new ArgumentException("Invalid resample factor"); } int w = this.Width / factor; int h = this.Height / factor; int[] dest = new int[w * h]; int p = 0; int[] pp = new int[4]; double l; double a; double b; for (int i = 0; i < h; i++) { int x = (i * factor) * this.Width; for (int k = 0; k < factor; k++) { pp[k] = x; x += this.Width; } for (int j = 0; j < w; j++) { int count = 0; l = a = b = 0f; for (int k = 0; k < factor; k++) { for (int m = 0; m < factor; m++) { LabColor lab = ColorTransform.RgbToLab(Color.FromArgb(this.Pixels[pp[k]])); l += lab.L; a += lab.A; b += lab.B; pp[k]++; ++count; } } dest[p++] = ColorTransform.LabToRgb(new LabColor( l / (double)count, a / (double)count, b / (double)count)).ToArgb() & 0xffffff; } } return(new RawImage(w, h, dest)); }
private static ClusteringPoint ToPoint(Color[] colors) { ClusteringPoint cp = new ClusteringPoint(24); int i = 0; for (int j = 0; j < colors.Length; j++) { LabColor lc = ColorTransform.RgbToLab(colors[j]); cp[i++] = lc.L; cp[i++] = lc.A; cp[i++] = lc.B; if (i >= cp.Size) { break; } } return(cp); }
private static string ColorSearchSql(int color, ColorSearchWidth width, out LabColor lab) { lab = ColorTransform.RgbToLab(PaletteManager.ColorFromInt(color)); StringBuilder sb = new StringBuilder(); int w = (int)width; sb.Append(@"SELECT c.RGB, c.L, c.A, c.B FROM COLOR c, COLOR_INDEX_L l, COLOR_INDEX_A a, COLOR_INDEX_B b WHERE (l.RGB = c.RGB) AND (a.RGB = c.RGB) AND (b.RGB = l.RGB)"); sb.Append("AND (l.[HASH] "); int h = lab.HashL; if (w > 0) { sb.Append("IN ("); int c = 0; for (int i = -w; i <= w; i++) { if (c++ > 0) { sb.Append(','); } sb.Append((h + i).ToString()); } sb.Append(')'); } else { sb.Append("= "); sb.Append(h.ToString()); } sb.Append(')'); sb.Append(" AND (a.[HASH] "); h = lab.HashA; if (w > 0) { sb.Append("IN ("); int c = 0; for (int i = -w; i <= w; i++) { if (c++ > 0) { sb.Append(','); } sb.Append((h + i).ToString()); } sb.Append(')'); } else { sb.Append("= "); sb.Append(h.ToString()); } sb.Append(')'); sb.Append(" AND (b.[HASH] "); h = lab.HashB; if (w > 0) { sb.Append("IN ("); int c = 0; for (int i = -w; i <= w; i++) { if (c++ > 0) { sb.Append(','); } sb.Append((h + i).ToString()); } sb.Append(')'); } else { sb.Append("= "); sb.Append(h.ToString()); } sb.Append(')'); return(sb.ToString()); }
public static Color LabToRgb(LabColor lab) { return(LabColorTransform.LabToRgb(lab)); }
public static XyzColor LabToXyz(LabColor lab) { return(LabColorTransform.LabToXyz(lab)); }
public RawImage ResizeTo(int maxDimension) { if ((this.Width <= maxDimension) && (this.Height <= maxDimension)) { return(this); } double scaleX = (double)this.Width / (double)maxDimension; double scaleY = (double)this.Height / (double)maxDimension; scaleX = scaleX > scaleY ? scaleX : scaleY; int w = (int)((double)this.Width / scaleX); int h = (int)((double)this.Height / scaleX); scaleX = (double)this.Width / (double)(w + 1); int[] mapX = new int[w + 1]; for (int i = 0; i <= w; i++) { mapX[i] = (int)(scaleX * (double)i); } mapX[w] = this.Width; scaleY = (double)this.Height / (double)(h + 1); int[] mapY = new int[h + 1]; for (int i = 0; i <= h; i++) { mapY[i] = (int)(scaleY * (double)i); } mapY[h] = this.Height; int p = 0; double l; double a; double b; int[] dest = new int[w * h]; for (int i = 0; i < h; i++) { int y0 = mapY[i]; int y1 = mapY[i + 1]; for (int j = 0; j < w; j++) { int x0 = mapX[j]; int x1 = mapX[j + 1]; int count = 0; l = a = b = 0f; for (int ii = y0; ii < y1; ii++) { for (int jj = x0; jj < x1; jj++) { int c = this.Pixels[(ii * this.Width) + jj]; LabColor lab = ColorTransform.RgbToLab(Color.FromArgb(c)); l += lab.L; a += lab.A; b += lab.B; ++count; } } if (count > 0) { dest[p] = ColorTransform.LabToRgb(new LabColor( l / (double)count, a / (double)count, b / (double)count)).ToArgb() & 0xffffff; } ++p; } } return(new RawImage(w, h, dest)); }
public static Color LabToRgb(LabColor lab) { return(ColorTransform.XyzToRgb(ColorTransform.LabToXyz(lab))); }