Rumah >pembangunan bahagian belakang >C++ >Bagaimana untuk mencari warna yang paling hampir dalam susunan warna?

Bagaimana untuk mencari warna yang paling hampir dalam susunan warna?

Patricia Arquette
Patricia Arquetteasal
2024-12-28 12:50:11269semak imbas

How to Find the Closest Color in a Color Array?

Menentukan Warna Terdekat dalam Tatasusunan

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:

Metrik Jarak

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.

Pelaksanaan

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);
}

Pembantu Fungsi

// 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));

Kesimpulan

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!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn