Jika anda diberi N maksimal jauh warna (dan beberapa yang terkait jarak metrik), anda bisa datang dengan cara untuk mengurutkan warna-warna tersebut ke dalam beberapa order seperti yang pertama M juga cukup dekat untuk menjadi maksimal set yang berbeda?
Dengan kata lain, mengingat banyak warna berbeda, datang dengan memesan agar saya dapat menggunakan banyak warna seperti yang saya perlu mulai dari awal dan menjadi cukup yakin bahwa mereka semua berbeda dan yang terdekat warna juga sangat berbeda (misalnya, merah kebiruan isn't samping kemerahan biru).
Mengacak OK tapi tentu saja tidak optimal.
Klarifikasi: Diberikan beberapa besar dan visual yang berbeda set warna (misalnya 256 atau 1024), saya ingin mengurutkan mereka seperti itu ketika saya menggunakan yang pertama, mengatakan, 16 dari mereka yang saya dapatkan yang relatif visual yang berbeda subset dari warna. Ini adalah setara, kira-kira, untuk mengatakan saya ingin semacam ini daftar 1024 agar lebih dekat masing-masing warna yang visual, yang terpisah lebih jauh mereka berada di daftar.
Tampaknya persepsi ini penting untuk anda, dalam hal ini anda mungkin ingin mempertimbangkan untuk bekerja dengan persepsi warna ruang seperti YUV, YCbCr atau Lab. Setiap kali saya've digunakan orang-orang, mereka telah memberikan saya hasil yang jauh lebih baik dari sRGB sendiri.
Mengkonversi ke dan dari sRGB dapat menjadi sakit tapi dalam kasus anda benar-benar bisa membuat algoritma yang lebih sederhana dan sebagai bonus ini sebagian besar akan bekerja untuk warna tirai juga!
Hal ini juga terdengar seperti beberapa jenis resistance grafik di mana anda mencoba untuk memetakan jalur yang paling perlawanan. Jika anda invers persyaratan, jalan perlawanan maksimal, itu mungkin dapat digunakan untuk menghasilkan suatu set yang dari mulai menghasilkan maksimum perbedaan sebagai anda pergi, dan menjelang akhir mulai kembali ke nilai-nilai yang lebih dekat dengan orang lain.
Misalnya, di sini's salah satu cara yang mungkin untuk melakukan apa yang anda inginkan.
Ini akan, tampaknya, menghasilkan daftar yang dimulai dengan warna yang terjauh dari semua warna lain, dan kemudian pergi ke bawah, warna menjelang akhir dari daftar akan lebih dekat ke warna lain pada umumnya.
Edit: Membaca balasan anda untuk posting pertama saya, tentang tata ruang subdivisi, tidak akan persis sesuai dengan uraian di atas, karena warna-warna yang dekat dengan warna lain akan jatuh ke bawah daftar, tapi let's mengatakan anda memiliki kelompok warna-warna di suatu tempat, setidaknya salah satu warna dari gugus tersebut akan berada dekat mulai dari daftar, dan itu akan menjadi salah satu yang umumnya adalah terjauh dari semua warna lain secara total. Jika itu masuk akal.
Masalah ini disebut kuantisasi warna, dan sudah banyak dikenal algoritma: http://en.wikipedia.org/wiki/Color_quantization saya tahu orang-orang yang menerapkan octree pendekatan untuk efek yang baik.
Anda hanya bisa memilah kandidat warna berdasarkan maksimum-menjauhkan dari minimum jarak untuk setiap indeks warna.
Menggunakan Euclidean warna kaki:
public double colordistance(Color color0, Color color1) {
int c0 = color0.getRGB();
int c1 = color1.getRGB();
return distance(((c0>>16)&0xFF), ((c0>>8)&0xFF), (c0&0xFF), ((c1>>16)&0xFF), ((c1>>8)&0xFF), (c1&0xFF));
}
public double distance(int r1, int g1, int b1, int r2, int g2, int b2) {
int dr = (r1 - r2);
int dg = (g1 - g2);
int db = (b1 - b2);
return Math.sqrt(dr * dr + dg * dg + db * db);
}
Meskipun anda dapat menggantinya dengan apa pun yang anda inginkan. Ini hanya membutuhkan warna jarak rutin.
public void colordistancesort(Color[] candidateColors, Color[] indexColors) {
double current;
double distance[] = new double[candidateColors.length];
for (int j = 0; j < candidateColors.length; j++) {
distance[j] = -1;
for (int k = 0; k < indexColors.length; k++) {
current = colordistance(indexColors[k], candidateColors[j]);
if ((distance[j] == -1) || (current < distance[j])) {
distance[j] = current;
}
}
}
//just sorts.
for (int j = 0; j < candidateColors.length; j++) {
for (int k = j + 1; k < candidateColors.length; k++) {
if (distance[j] > distance[k]) {
double d = distance[k];
distance[k] = distance[j];
distance[j] = d;
Color m = candidateColors[k];
candidateColors[k] = candidateColors[j];
candidateColors[j] = m;
}
}
}
}
Jika saya'm memahami pertanyaan dengan benar, anda berharap untuk mendapatkan subset dari M warna dengan tertinggi berarti jarak antara warna, mengingat jarak beberapa fungsi d.
Dengan kata lain, mengingat awal set N warna sebagai besar, undirected graph di mana semua warna yang terhubung, anda ingin menemukan jalan terpanjang bahwa setiap kunjungan M node.
Pemecahan NP-complete graph masalah adalah cara di luar saya, saya'm takut, tapi anda bisa mencoba menjalankan fisik sederhana simulasi:
It's jauh dari efisien, tapi untuk usaha kecil M mungkin cukup efisien, dan itu akan memberi dekat hasil yang optimal.
Jika anda colour jarak fungsi sederhana, mungkin ada yang lebih deterministik cara menghasilkan optimal subset.
Ini greedy algoritma harus memberikan anda hasil yang baik.
Anda dapat membagi mereka ke RGB HEX format sehingga anda dapat membandingkan R dengan R's warna yang berbeda, yang sama dengan G dan B.
Format sama seperti HTML
XX XX XX
RR GG BB
00 00 00 = black
ff ff ff = white
ff 00 00 = red
00 ff 00 = green
00 00 ff = blue
Jadi satu-satunya hal yang anda akan perlu untuk memutuskan seberapa dekat anda menginginkan warna dan apa yang dapat diterima berbeda untuk segmen yang dianggap berbeda.
Apakah anda berarti bahwa dari satu set N warna, anda perlu memilih M warna, di mana M < N, seperti bahwa M adalah terbaik representasi dari N warna di ruang M?
Sebagai contoh yang lebih baik, mengurangi benar-color (24 bit warna ruang) untuk 8-bit dipetakan warna ruang (GIF?).
Ada kuantisasi algoritma ini, seperti Adaptif Spasial Subdivisi algoritma yang digunakan oleh ImageMagic.
Algoritma ini biasanya don't hanya memilih warna yang ada dari sumber ruang, tetapi menciptakan warna baru dalam target ruang yang paling dekat menyerupai sumber warna. Sebagai contoh sederhana, jika anda memiliki 3 warna dalam gambar asli mana dua berwarna merah (dengan intensitas yang berbeda atau kebiruan tints dll.) dan yang ketiga adalah biru, dan kebutuhan untuk mengurangi dua warna, gambar target bisa memiliki warna merah itu adalah beberapa jenis rata-rata dari dua asli warna merah + biru warna dari gambar asli.
Jika anda membutuhkan sesuatu yang lain maka saya didn't mengerti pertanyaan anda :)