Rumah >pembangunan bahagian belakang >C++ >Bagaimana untuk mencari warna yang paling hampir dalam susunan warna?
Membandingkan warna dan mengenal pasti padanan terdekat dalam tatasusunan ialah tugas biasa dalam aplikasi grafik. Dalam artikel ini, kami akan meneroka tiga kaedah berbeza untuk mencapai perkara ini:
1. Perbandingan Hue-Sahaja:
Kaedah ini hanya mengambil kira rona warna, mengabaikan ketepuan dan kecerahan. Jarak rona dikira menggunakan penolakan mudah, dan rona terdekat ditentukan dengan mencari jarak minimum.
2. Jarak RGB:
Kaedah ini mengukur jarak terus antara nilai RGB warna. Perbezaan warna dikira sebagai jarak Euclidean dalam ruang RGB, dan warna yang paling hampir ditemui dengan meminimumkan perbezaan ini.
3. Perbandingan Hue, Ketepuan dan Kecerahan Wajaran:
Kaedah ini menggabungkan rona, ketepuan dan kecerahan secara wajaran. Kecerahan yang dirasakan dikira dan nombor warna dikira berdasarkan ketepuan dan kecerahan. Warna yang paling hampir ditentukan dengan meminimumkan jumlah wajaran perbezaan warna dan jarak rona.
Berikut ialah pelaksanaan kaedah ini:
// Hue-Only Comparison int closestColor1(List<Color> colors, Color target) { var hue1 = target.GetHue(); var diffs = colors.Select(n => getHueDistance(n.GetHue(), hue1)); var diffMin = diffs.Min(n => n); return diffs.ToList().FindIndex(n => n == diffMin); } // RGB Distance Comparison int closestColor2(List<Color> colors, Color target) { var colorDiffs = colors.Select(n => ColorDiff(n, target)).Min(n => n); return colors.FindIndex(n => ColorDiff(n, target) == colorDiffs); } // Weighted Hue, Saturation, and Brightness Comparison int closestColor3(List<Color> colors, Color target) { float hue1 = target.GetHue(); var num1 = ColorNum(target); var diffs = colors.Select(n => Math.Abs(ColorNum(n) - num1) + getHueDistance(n.GetHue(), hue1)); var diffMin = diffs.Min(x => x); return diffs.ToList().FindIndex(n => n == diffMin); }
// Color brightness as perceived: float getBrightness(Color c) => (c.R * 0.299f + c.G * 0.587f + c.B * 0.114f) / 256f; // Distance between two hues: float getHueDistance(float hue1, float hue2) => Math.Abs(hue1 - hue2) > 180 ? 360 - Math.Abs(hue1 - hue2) : Math.Abs(hue1 - hue2); // Weighed by saturation and brightness: float ColorNum(Color c) => c.GetSaturation() * factorSat + getBrightness(c) * factorBri; // Distance in RGB space: int ColorDiff(Color c1, Color c2) => (int)Math.Sqrt((c1.R - c2.R) * (c1.R - c2.R) + (c1.G - c2.G) * (c1.G - c2.G) + (c1.B - c2.B) * (c1.B - c2.B));
Pilihan metrik jarak warna bergantung pada aplikasi tertentu. Jika rona adalah pertimbangan utama, perbandingan rona sahaja sudah memadai. Untuk padanan warna yang lebih umum, kaedah perbandingan rona atau warna berwajaran, ketepuan dan kecerahan RGB memberikan hasil yang lebih tepat.
Atas ialah kandungan terperinci Bagaimana untuk mencari warna yang paling hampir dalam susunan warna?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!