Následná: „Třídění“ barvy dle rozlišovací

hlasů
18

původní Otázka

Pokud jste dostali se N maximálně vzdálené barvy (a některé spojené vzdálenost metrické jednotky), můžete přijít na způsob, jak třídit tyto barvy do nějakém pořadí tak, že první M jsou také poměrně blízko k bytí maximálně zřejmých?

Jinými slovy, vzhledem k tomu spoustu odlišných barev, přijít s uspořádáním, takže mohu použít jako mnoho barev, jak musím začíná na začátku a být náležitě zaručeno, že všichni jsou odlišné a že poblíž barvy jsou také velmi odlišné (např namodralá červená není vedle načervenalé modrá).

Randomizing je v pořádku, ale rozhodně není optimální.

Upřesnění: Vzhledem k tomu, některé velké a vizuálně odlišný sadu barev (řekněme 256 nebo 1024), já chci, aby třídit je taková, že když použiji první, řekněme, 16 z nich, které jsem si poměrně vizuálně odlišný podmnožinu barev. Toto je ekvivalent, hrubě, aby říkat chci vyřešit tento seznam 1024 tak, že čím blíže jednotlivé barvy jsou vizuálně se dál od sebe, které jsou na seznamu.

Položena 04/08/2008 v 16:14
zdroj uživatelem
V jiných jazycích...                            


9 odpovědí

hlasů
2

N maximálně vzdálené barvy lze považovat za sadu dobře rozmístěných bodů v 3-dimenzionální (barva) prostoru. Pokud můžete generovat je ze sekvence Halton , pak každý prefix (první M barev) také sestává z dobře rozmístěných bodů.

Odpovězeno 25/08/2008 v 09:44
zdroj uživatelem

hlasů
2

Zdá se, že vnímání je pro vás důležité, v tomto případě budete chtít, aby zvážila práci s percepční barevného prostoru jako YUV, YCbCr nebo Lab. Pokaždé, když jsem použil ty, oni mi dali mnohem lepší výsledky než samotný sRGB.

Konverzi do az sRGB může být bolest, ale v případě, že by se skutečně dělat algoritmus jednodušší a jako bonus bude většinou pracují pro barevné žaluzie taky!

Odpovězeno 12/08/2008 v 13:33
zdroj uživatelem

hlasů
2

Tento problém se nazývá barva kvantování, a má mnoho známých algoritmů: http://en.wikipedia.org/wiki/Color_quantization Znám lidi, kteří realizovaných přístup octree k dobrým účinkem.

Odpovězeno 12/08/2008 v 13:11
zdroj uživatelem

hlasů
2

To také zní mi to jako nějaký druh odporu grafu , kde se snaží zmapovat cestu nejmenšího odporu. Máte-li inverzní požadavky, cesta maximální odolnost, mohlo by to snad být použity k vytvoření souboru, který od samého počátku produkuje maximální rozdíl as you go, a ke konci se začne vracet k hodnotám blíže k ostatním.

Například, tady je jeden způsob, jak možná to, co chcete.

  1. Výpočet vzdálenosti (viz vaše další příspěvek ) od každé barvy, pro všechny ostatní barvy
  2. Součet vzdáleností pro každou barvu, to vám dává informaci o tom, jak daleko tato barva je od všech ostatních barev v celkové
  3. Seřadit podle vzdálenosti, které jdou dolů

To by, jak se zdá, vytvoření seznamu, který začíná s barvou, která je nejdále od všech ostatních barev, a pak jít dolů, barvy ke konci seznamu by být blíže k jiné barvy obecně.

Edit: Čtení svou odpověď na můj první příspěvek, o územním členění, nebude přesně vyhovují výše uvedenému popisu, protože barvy v blízkosti jiných barev by spadnout na dno seznamu, ale řekněme, že máte nějaký shluk barev někde na alespoň jedna z barev z tohoto shluku by být umístěn v blízkosti začátku seznamu, a to by byl ten, který byl obecně nejdále od všech ostatních barev celkem. Pokud to dává smysl.

Odpovězeno 04/08/2008 v 16:38
zdroj uživatelem

hlasů
1

Dalo by se jen seřadit kandidáty barvy založené na maximální-odosobněné minimálního-vzdálenosti na některou z barev indexu.

Použitím euklidovské barev vzdálenost:

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

I když to může nahradit cokoli chcete. Je to jen potřebuje barva vzdálenost rutina.

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;
            }
        }
    }
}
Odpovězeno 03/09/2012 v 21:50
zdroj uživatelem

hlasů
1
  1. Začít se dvěma seznamy. CandidateColors, který zpočátku obsahuje vaše různé barvy a SortedColors, která je zpočátku prázdná.
  2. Vyberte si jakoukoliv barvu a odstranit ji z CandidateColors a dát ho do SortedColors. Jedná se o první barvu a bude nejběžnější, takže je to dobré místo k vyzvednutí barvu, která jives dobře s aplikací.
  3. Pro každou barvu v CandidateColors vypočítat svou celkovou vzdálenost. Celková vzdálenost je součet vzdáleností od CandidateColor ke každé z barev v SortedColors.
  4. Odstranit barvu s největší celkovou vzdálenost od CandidateColors a přidat ji do konce roku SortedColors.
  5. Pokud CandidateColors není prázdný, vraťte se ke kroku 3.

Tento hladový algoritmus by vám dobré výsledky.

Odpovězeno 21/11/2008 v 10:29
zdroj uživatelem

hlasů
1

Pokud jsem pochopit otázku správně, budete chtít získat podmnožinu M barev s nejvyšší průměrnou vzdálenost mezi barvami, vzhledem k tomu, některé funkce vzdálenosti d .

Jinak řečeno, s ohledem na počáteční sadu N barvách jako velké, undirected graf, ve kterém jsou připojeny všechny barvy, které chcete najít nejdelší cestu , která navštíví některou M uzly.

Řešení NP-úplných problémů graf je daleko za mnou Mám strach, ale můžete zkusit spustit jednoduchý fyzikální simulace:

  1. Generovat M náhodných bodů v barevném prostoru
  2. Vypočte se vzdálenost mezi každým bodem
  3. Vypočítat odpuzování vektorů pro každý bod, který bude se pohybovat od všech ostatních bodech (s použitím 1 / ( vzdálenost ^ 2), jako velikost vektoru)
  4. Součet Odpor vektorů pro každý bod
  5. Aktualizace polohy každého bodu v souladu s sečtených odpudivých vektorů
  6. Omezit některý z vázaných souřadnic (jako je svítivost bude negativní, nebo nad sebou)
  7. Opakujte postup od kroku 2, dokud body stabilizovat
  8. Pro každý bod, vyberte nejbližší barvu z původního souboru N

Je to zdaleka efektivní, ale pro malé M může být dostatečně efektivní, a to dá u optimálních výsledků.

Pokud je vaše barva vzdálenost funkce je jednoduchá, může existovat více deterministický způsob generování optimální podmnožinu.

Odpovězeno 16/10/2008 v 18:11
zdroj uživatelem

hlasů
0

Můžete je rozdělit do formátu RGB HEX, takže si můžete porovnat s R R je jiné barvy, stejné jako u G a B.

Stejný formát jako 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

Takže jediné, co budete muset rozhodnout, jak blízko chcete, barvy a co je přijatelné pro rozdíl segmentů, které mají být považovány za rozdílné.

Odpovězeno 04/08/2008 v 16:31
zdroj uživatelem

hlasů
0

Máte na mysli, že ze sady N barev, budete muset vybrat M barvy, kde M <N, takže M je nejlepší zastoupení N barev v M prostoru?

Jako lepší například snížit skutečný-color (24 bit barevného prostoru) na 8-bitové mapované barevném prostoru (GIF?).

Existuje kvantování algoritmy pro to, stejně jako územní subdivizi adaptivní algoritmus použitý imagemagick.

Tyto algoritmy obvykle nemají jen vybrat existující barvy ze zdrojového prostoru, ale vytváří nové barvy v cílovém prostoru, které se nejvíce podobají zdrojové barvy. Jako zjednodušený příklad, pokud máte 3 barvy v původním obraze, kde dva jsou červená (s různou intenzitou nebo namodralé odstíny atd.) A třetí je modrá a je třeba snížit na dvě barvy, cílový obraz mohl mít červenou barvu že je nějaký průměr původní dvě červená + modrá barva z původního obrazu.

Pokud potřebujete něco jiného, ​​pak jsem nerozuměl svůj dotaz :)

Odpovězeno 04/08/2008 v 16:29
zdroj uživatelem

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more