그래프에서 뚜렷하게 다른 RGB 색상 생성


84

그래프를 생성하고 다른 데이터 세트를 표시 할 때 일반적으로 세트를 색상별로 구분하는 것이 좋습니다. 따라서 한 줄은 빨간색이고 다음 줄은 녹색입니다. 문제는 데이터 세트의 수를 알 수없는 경우 이러한 색상을 무작위로 생성해야하며 종종 서로 매우 가깝게됩니다 (예 : 녹색, 연한 녹색).

이 문제를 어떻게 해결할 수 있는지, 그리고 뚜렷하게 다른 색상을 생성하는 것이 더 가능할 수 있는지에 대한 아이디어가 있습니까?

C # 및 RGB 기반 색상으로 된 예제 (예제없이 문제와 솔루션을 자유롭게 논의 할 수 있음)가 있다면 좋을 것입니다.


답변:


132

0 ~ 255 R, G 및 B의 세 가지 색상 채널이 있습니다.

먼저 통과

0, 0, 255
0, 255, 0
255, 0, 0

그런 다음 통과

0, 255, 255
255, 0, 255
255, 255, 0

그런 다음 2 => 128로 나누고 다시 시작합니다.

0, 0, 128
0, 128, 0
128, 0, 0
0, 128, 128
128, 0, 128
128, 128, 0

2로 나누기 => 64

다음에 64를 128에 추가 => 192

패턴을 따라.

프로그래밍이 간단하고 상당히 뚜렷한 색상을 제공합니다.

편집 : 코드 샘플 요청

또한-회색이 허용되는 색상 인 경우 아래와 같이 추가 패턴을 추가합니다.

255, 255, 255
128, 128, 128 

코드에서 이러한 생성을 처리 할 수있는 방법에는 여러 가지가 있습니다.

쉬운 방법

고정 된 수 이상의 색상이 필요하지 않다고 보장 할 수 있다면이 패턴에 따라 색상 배열을 생성하고이를 사용하십시오.

    static string[] ColourValues = new string[] { 
        "FF0000", "00FF00", "0000FF", "FFFF00", "FF00FF", "00FFFF", "000000", 
        "800000", "008000", "000080", "808000", "800080", "008080", "808080", 
        "C00000", "00C000", "0000C0", "C0C000", "C000C0", "00C0C0", "C0C0C0", 
        "400000", "004000", "000040", "404000", "400040", "004040", "404040", 
        "200000", "002000", "000020", "202000", "200020", "002020", "202020", 
        "600000", "006000", "000060", "606000", "600060", "006060", "606060", 
        "A00000", "00A000", "0000A0", "A0A000", "A000A0", "00A0A0", "A0A0A0", 
        "E00000", "00E000", "0000E0", "E0E000", "E000E0", "00E0E0", "E0E0E0", 
    };

어려운 방법

필요한 색상 수를 모르는 경우 아래 코드는이 패턴을 사용하여 최대 896 개의 색상을 생성합니다. (896 = 256 * 7/2) 256은 채널당 색상 공간이고, 7 개의 패턴이 있으며, 1 개의 색상 값으로 구분 된 색상에 도달하기 전에 중지합니다.

나는 아마도 내가 필요했던 것보다 더 열심히이 코드를 만들었을 것이다. 먼저 255에서 시작하여 위에서 설명한 패턴에 따라 값을 생성하는 강도 생성기가 있습니다. 패턴 생성기는 7 가지 색상 패턴을 반복합니다.

using System;

class Program {
    static void Main(string[] args) {
        ColourGenerator generator = new ColourGenerator();
        for (int i = 0; i < 896; i++) {
            Console.WriteLine(string.Format("{0}: {1}", i, generator.NextColour()));
        }
    }
}

public class ColourGenerator {

    private int index = 0;
    private IntensityGenerator intensityGenerator = new IntensityGenerator();

    public string NextColour() {
        string colour = string.Format(PatternGenerator.NextPattern(index),
            intensityGenerator.NextIntensity(index));
        index++;
        return colour;
    }
}

public class PatternGenerator {
    public static string NextPattern(int index) {
        switch (index % 7) {
        case 0: return "{0}0000";
        case 1: return "00{0}00";
        case 2: return "0000{0}";
        case 3: return "{0}{0}00";
        case 4: return "{0}00{0}";
        case 5: return "00{0}{0}";
        case 6: return "{0}{0}{0}";
        default: throw new Exception("Math error");
        }
    }
}

public class IntensityGenerator {
    private IntensityValueWalker walker;
    private int current;

    public string NextIntensity(int index) {
        if (index == 0) {
            current = 255;
        }
        else if (index % 7 == 0) {
            if (walker == null) {
                walker = new IntensityValueWalker();
            }
            else {
                walker.MoveNext();
            }
            current = walker.Current.Value;
        }
        string currentText = current.ToString("X");
        if (currentText.Length == 1) currentText = "0" + currentText;
        return currentText;
    }
}

public class IntensityValue {

    private IntensityValue mChildA;
    private IntensityValue mChildB;

    public IntensityValue(IntensityValue parent, int value, int level) {
        if (level > 7) throw new Exception("There are no more colours left");
        Value = value;
        Parent = parent;
        Level = level;
    }

    public int Level { get; set; }
    public int Value { get; set; }
    public IntensityValue Parent { get; set; }

    public IntensityValue ChildA {
        get {
            return mChildA ?? (mChildA = new IntensityValue(this, this.Value - (1<<(7-Level)), Level+1));
        }
    }

    public IntensityValue ChildB {
        get {
            return mChildB ?? (mChildB = new IntensityValue(this, Value + (1<<(7-Level)), Level+1));
        }
    }
}

public class IntensityValueWalker {

    public IntensityValueWalker() {
        Current = new IntensityValue(null, 1<<7, 1);
    }

    public IntensityValue Current { get; set; }

    public void MoveNext() {
        if (Current.Parent == null) {
            Current = Current.ChildA;
        }
        else if (Current.Parent.ChildA == Current) {
            Current = Current.Parent.ChildB;
        }
        else {
            int levelsUp = 1;
            Current = Current.Parent;
            while (Current.Parent != null && Current == Current.Parent.ChildB) {
                Current = Current.Parent;
                levelsUp++;
            }
            if (Current.Parent != null) {
                Current = Current.Parent.ChildB;
            }
            else {
                levelsUp++;
            }
            for (int i = 0; i < levelsUp; i++) {
                Current = Current.ChildA;
            }

        }
    }
}

나는 예를 완전히 따르지 않습니다. 누구든지 이에 대한 C # 예제를 제공 할 수 있습니까?
McBainUK 2010

코드 샘플이 도움이되기를 바랍니다. 강도 값 트리를 걷는 방법이 훨씬 더 깔끔 할 것입니다.하지만 이것은 충분히 잘 작동하는 첫 번째 찌르기였습니다. 건배.
Sam Meldrum

4
이 알고리즘은 매우 유사한 일부 색상 쌍을 생성합니다 (특히 매우 어둡거나 밝고 채도가 낮은 영역). 채도와 밝기가 높은 영역에서 시작하는 것은 좋지만 여전히 시각적으로 구별되는 미묘한 색상을 많이 놓칩니다.
Phrogz 2012

1
나는 자바 스크립트에서 비슷한 일을하게되었다. rgb에 정신적 버팀목 / 제한 시약이있는 것 같다. 우리가 있었다면 네 개의 256-선택 색상 채널을, 우리는 (*와 수식을 작성합니다 N ) 더 많은 색상을? 그럼에도 불구하고 @Phrogz 및 @dean의 비판은 여전히 ​​유효합니다 (&은 더 나은 답변을 찾기 위해 SO를 검색 한 이유입니다). 각 강도 단계에서 뚜렷하게 다른 음영을 잡는 방법이 있어야합니다. 아래 의 Phrogz의 대답 은 올바른 길에 있지만 int카운터에서 수백 가지 색상을 원한다면 나 같은 사람들이 빨리 접근 할 수 없습니다 .
ruffin

2
프로그래밍 방식으로 질문을 해결하는 답변을 추가했습니다. 이 대답은 실제로 잘못되었습니다. 믹스에 128을 더할 때. 0과 255로 패턴을 만드는 것이 아닙니다. "Easy Way"색상 목록은이 점에서 똑같이 깨집니다. 그것들은 기본적으로 흰색, 검정색, R, G, B, C, Y, M이 점차 희미하고 희미합니다.
Tatarize

79

색상별로 변형 목록을 구현하려면 255를 사용하여 모든 가능성을 사용한 다음 0과이 두 값으로 모든 RGB 패턴을 추가하십시오. 그런 다음 128 개와 모든 RGB 조합을 추가합니다. 그런 다음 64. 다음 192. 기타.

자바에서는

public Color getColor(int i) {
    return new Color(getRGB(i));
}

public int getRGB(int index) {
    int[] p = getPattern(index);
    return getElement(p[0]) << 16 | getElement(p[1]) << 8 | getElement(p[2]);
}

public int getElement(int index) {
    int value = index - 1;
    int v = 0;
    for (int i = 0; i < 8; i++) {
        v = v | (value & 1);
        v <<= 1;
        value >>= 1;
    }
    v >>= 1;
    return v & 0xFF;
}

public int[] getPattern(int index) {
    int n = (int)Math.cbrt(index);
    index -= (n*n*n);
    int[] p = new int[3];
    Arrays.fill(p,n);
    if (index == 0) {
        return p;
    }
    index--;
    int v = index % 3;
    index = index / 3;
    if (index < n) {
        p[v] = index % n;
        return p;
    }
    index -= n;
    p[v      ] = index / n;
    p[++v % 3] = index % n;
    return p;
}

이것은 미래에 그 유형의 패턴을 무한히 (2 ^ 24) 생성 할 것입니다. 그러나 백 개 정도의 지점 후에는 파란색 자리에 0 또는 32가있는 색상 사이에 많은 차이가 나타나지 않을 것입니다.

이것을 다른 색 공간으로 정규화하는 것이 더 나을 수 있습니다. 예를 들어 L, A, B 값이 정규화되고 변환 된 LAB 색상 공간. 그래서 색의 뚜렷 함은 인간의 눈에 더 가까운 것을 통해 밀려납니다.

getElement ()는 8 비트 숫자의 엔디안을 반전하고 0이 아닌 -1부터 계산을 시작합니다 (255로 마스킹). 그래서 그것은 255,0,127,192,64, ... 숫자가 커짐에 따라 덜 중요한 비트를 이동하여 숫자를 세분화합니다.

getPattern ()은 패턴에서 가장 중요한 요소가 무엇인지 결정합니다 (큐브 루트). 그런 다음 가장 중요한 요소를 포함하는 3N² + 3N + 1 다른 패턴을 분석합니다.

이 알고리즘은 다음을 생성합니다 (처음 128 개 값).

#FFFFFF 
#000000 
#FF0000 
#00FF00 
#0000FF 
#FFFF00 
#00FFFF 
#FF00FF 
#808080 
#FF8080 
#80FF80 
#8080FF 
#008080 
#800080 
#808000 
#FFFF80 
#80FFFF 
#FF80FF 
#FF0080 
#80FF00 
#0080FF 
#00FF80 
#8000FF 
#FF8000 
#000080 
#800000 
#008000 
#404040 
#FF4040 
#40FF40 
#4040FF 
#004040 
#400040 
#404000 
#804040 
#408040 
#404080 
#FFFF40 
#40FFFF 
#FF40FF 
#FF0040 
#40FF00 
#0040FF 
#FF8040 
#40FF80 
#8040FF 
#00FF40 
#4000FF 
#FF4000 
#000040 
#400000 
#004000 
#008040 
#400080 
#804000 
#80FF40 
#4080FF 
#FF4080 
#800040 
#408000 
#004080 
#808040 
#408080 
#804080 
#C0C0C0 
#FFC0C0 
#C0FFC0 
#C0C0FF 
#00C0C0 
#C000C0 
#C0C000 
#80C0C0 
#C080C0 
#C0C080 
#40C0C0 
#C040C0 
#C0C040 
#FFFFC0 
#C0FFFF 
#FFC0FF 
#FF00C0 
#C0FF00 
#00C0FF 
#FF80C0 
#C0FF80 
#80C0FF 
#FF40C0 
#C0FF40 
#40C0FF 
#00FFC0 
#C000FF 
#FFC000 
#0000C0 
#C00000 
#00C000 
#0080C0 
#C00080 
#80C000 
#0040C0 
#C00040 
#40C000 
#80FFC0 
#C080FF 
#FFC080 
#8000C0 
#C08000 
#00C080 
#8080C0 
#C08080 
#80C080 
#8040C0 
#C08040 
#40C080 
#40FFC0 
#C040FF 
#FFC040 
#4000C0 
#C04000 
#00C040 
#4080C0 
#C04080 
#80C040 
#4040C0 
#C04040 
#40C040 
#202020 
#FF2020 
#20FF20 

왼쪽에서 오른쪽으로, 위에서 아래로 읽으십시오. 729 색 (9³). 따라서 n = 9까지의 모든 패턴이 충돌하기 시작하는 속도를 알 수 있습니다. WRGBCYMK 변형이 너무 많습니다. 이 솔루션은 영리하지만 기본적으로 기본 색상의 다른 음영 만 수행합니다.

컬러 그리드, 729 16x16

충돌의 대부분은 녹색과 대부분의 사람들에게 대부분의 녹색이 얼마나 유사한 지에 기인합니다. 같은 색이 아닐 정도로 다르기보다는 처음에 각각이 최대한 달라야한다는 요구. 그리고 아이디어의 기본 결함으로 인해 기본 색상 패턴과 동일한 색조가 발생합니다.


CIELab2000 색상 공간 및 거리 루틴을 사용하여 무작위로 10k 다른 색상을 선택하고 시도하고 이전 색상에서 최대로 먼 최소 거리 (요청의 정의)를 찾으면 위의 솔루션보다 더 오래 충돌하지 않습니다.

최대 색상 거리

Easy Way의 정적 목록이라고 할 수 있습니다. 729 개의 항목을 생성하는 데 1 시간 반이 걸렸습니다.

#9BC4E5
#310106
#04640D
#FEFB0A
#FB5514
#E115C0
#00587F
#0BC582
#FEB8C8
#9E8317
#01190F
#847D81
#58018B
#B70639
#703B01
#F7F1DF
#118B8A
#4AFEFA
#FCB164
#796EE6
#000D2C
#53495F
#F95475
#61FC03
#5D9608
#DE98FD
#98A088
#4F584E
#248AD0
#5C5300
#9F6551
#BCFEC6
#932C70
#2B1B04
#B5AFC4
#D4C67A
#AE7AA1
#C2A393
#0232FD
#6A3A35
#BA6801
#168E5C
#16C0D0
#C62100
#014347
#233809
#42083B
#82785D
#023087
#B7DAD2
#196956
#8C41BB
#ECEDFE
#2B2D32
#94C661
#F8907D
#895E6B
#788E95
#FB6AB8
#576094
#DB1474
#8489AE
#860E04
#FBC206
#6EAB9B
#F2CDFE
#645341
#760035
#647A41
#496E76
#E3F894
#F9D7CD
#876128
#A1A711
#01FB92
#FD0F31
#BE8485
#C660FB
#120104
#D48958
#05AEE8
#C3C1BE
#9F98F8
#1167D9
#D19012
#B7D802
#826392
#5E7A6A
#B29869
#1D0051
#8BE7FC
#76E0C1
#BACFA7
#11BA09
#462C36
#65407D
#491803
#F5D2A8
#03422C
#72A46E
#128EAC
#47545E
#B95C69
#A14D12
#C4C8FA
#372A55
#3F3610
#D3A2C6
#719FFA
#0D841A
#4C5B32
#9DB3B7
#B14F8F
#747103
#9F816D
#D26A5B
#8B934B
#F98500
#002935
#D7F3FE
#FCB899
#1C0720
#6B5F61
#F98A9D
#9B72C2
#A6919D
#2C3729
#D7C70B
#9F9992
#EFFBD0
#FDE2F1
#923A52
#5140A7
#BC14FD
#6D706C
#0007C4
#C6A62F
#000C14
#904431
#600013
#1C1B08
#693955
#5E7C99
#6C6E82
#D0AFB3
#493B36
#AC93CE
#C4BA9C
#09C4B8
#69A5B8
#374869
#F868ED
#E70850
#C04841
#C36333
#700366
#8A7A93
#52351D
#B503A2
#D17190
#A0F086
#7B41FC
#0EA64F
#017499
#08A882
#7300CD
#A9B074
#4E6301
#AB7E41
#547FF4
#134DAC
#FDEC87
#056164
#FE12A0
#C264BA
#939DAD
#0BCDFA
#277442
#1BDE4A
#826958
#977678
#BAFCE8
#7D8475
#8CCF95
#726638
#FEA8EB
#EAFEF0
#6B9279
#C2FE4B
#304041
#1EA6A7
#022403
#062A47
#054B17
#F4C673
#02FEC7
#9DBAA8
#775551
#835536
#565BCC
#80D7D2
#7AD607
#696F54
#87089A
#664B19
#242235
#7DB00D
#BFC7D6
#D5A97E
#433F31
#311A18
#FDB2AB
#D586C9
#7A5FB1
#32544A
#EFE3AF
#859D96
#2B8570
#8B282D
#E16A07
#4B0125
#021083
#114558
#F707F9
#C78571
#7FB9BC
#FC7F4B
#8D4A92
#6B3119
#884F74
#994E4F
#9DA9D3
#867B40
#CED5C4
#1CA2FE
#D9C5B4
#FEAA00
#507B01
#A7D0DB
#53858D
#588F4A
#FBEEEC
#FC93C1
#D7CCD4
#3E4A02
#C8B1E2
#7A8B62
#9A5AE2
#896C04
#B1121C
#402D7D
#858701
#D498A6
#B484EF
#5C474C
#067881
#C0F9FC
#726075
#8D3101
#6C93B2
#A26B3F
#AA6582
#4F4C4F
#5A563D
#E83005
#32492D
#FC7272
#B9C457
#552A5B
#B50464
#616E79
#DCE2E4
#CF8028
#0AE2F0
#4F1E24
#FD5E46
#4B694E
#C5DEFC
#5DC262
#022D26
#7776B8
#FD9F66
#B049B8
#988F73
#BE385A
#2B2126
#54805A
#141B55
#67C09B
#456989
#DDC1D9
#166175
#C1E29C
#A397B5
#2E2922
#ABDBBE
#B4A6A8
#A06B07
#A99949
#0A0618
#B14E2E
#60557D
#D4A556
#82A752
#4A005B
#3C404F
#6E6657
#7E8BD5
#1275B8
#D79E92
#230735
#661849
#7A8391
#FE0F7B
#B0B6A9
#629591
#D05591
#97B68A
#97939A
#035E38
#53E19E
#DFD7F9
#02436C
#525A72
#059A0E
#3E736C
#AC8E87
#D10C92
#B9906E
#66BDFD
#C0ABFD
#0734BC
#341224
#8AAAC1
#0E0B03
#414522
#6A2F3E
#2D9A8A
#4568FD
#FDE6D2
#FEE007
#9A003C
#AC8190
#DCDD58
#B7903D
#1F2927
#9B02E6
#827A71
#878B8A
#8F724F
#AC4B70
#37233B
#385559
#F347C7
#9DB4FE
#D57179
#DE505A
#37F7DD
#503500
#1C2401
#DD0323
#00A4BA
#955602
#FA5B94
#AA766C
#B8E067
#6A807E
#4D2E27
#73BED7
#D7BC8A
#614539
#526861
#716D96
#829A17
#210109
#436C2D
#784955
#987BAB
#8F0152
#0452FA
#B67757
#A1659F
#D4F8D8
#48416F
#DEBAAF
#A5A9AA
#8C6B83
#403740
#70872B
#D9744D
#151E2C
#5C5E5E
#B47C02
#F4CBD0
#E49D7D
#DD9954
#B0A18B
#2B5308
#EDFD64
#9D72FC
#2A3351
#68496C
#C94801
#EED05E
#826F6D
#E0D6BB
#5B6DB4
#662F98
#0C97CA
#C1CA89
#755A03
#DFA619
#CD70A8
#BBC9C7
#F6BCE3
#A16462
#01D0AA
#87C6B3
#E7B2FA
#D85379
#643AD5
#D18AAE
#13FD5E
#B3E3FD
#C977DB
#C1A7BB
#9286CB
#A19B6A
#8FFED7
#6B1F17
#DF503A
#10DDD7
#9A8457
#60672F
#7D327D
#DD8782
#59AC42
#82FDB8
#FC8AE7
#909F6F
#B691AE
#B811CD
#BCB24E
#CB4BD9
#2B2304
#AA9501
#5D5096
#403221
#F9FAB4
#3990FC
#70DE7F
#95857F
#84A385
#50996F
#797B53
#7B6142
#81D5FE
#9CC428
#0B0438
#3E2005
#4B7C91
#523854
#005EA9
#F0C7AD
#ACB799
#FAC08E
#502239
#BFAB6A
#2B3C48
#0EB5D8
#8A5647
#49AF74
#067AE9
#F19509
#554628
#4426A4
#7352C9
#3F4287
#8B655E
#B480BF
#9BA74C
#5F514C
#CC9BDC
#BA7942
#1C4138
#3C3C3A
#29B09C
#02923F
#701D2B
#36577C
#3F00EA
#3D959E
#440601
#8AEFF3
#6D442A
#BEB1A8
#A11C02
#8383FE
#A73839
#DBDE8A
#0283B3
#888597
#32592E
#F5FDFA
#01191B
#AC707A
#B6BD03
#027B59
#7B4F08
#957737
#83727D
#035543
#6F7E64
#C39999
#52847A
#925AAC
#77CEDA
#516369
#E0D7D0
#FCDD97
#555424
#96E6B6
#85BB74
#5E2074
#BD5E48
#9BEE53
#1A351E
#3148CD
#71575F
#69A6D0
#391A62
#E79EA0
#1C0F03
#1B1636
#D20C39
#765396
#7402FE
#447F3E
#CFD0A8
#3A2600
#685AFC
#A4B3C6
#534302
#9AA097
#FD5154
#9B0085
#403956
#80A1A7
#6E7A9A
#605E6A
#86F0E2
#5A2B01
#7E3D43
#ED823B
#32331B
#424837
#40755E
#524F48
#B75807
#B40080
#5B8CA1
#FDCFE5
#CCFEAC
#755847
#CAB296
#C0D6E3
#2D7100
#D5E4DE
#362823
#69C63C
#AC3801
#163132
#4750A6
#61B8B2
#FCC4B5
#DEBA2E
#FE0449
#737930
#8470AB
#687D87
#D7B760
#6AAB86
#8398B8
#B7B6BF
#92C4A1
#B6084F
#853B5E
#D0BCBA
#92826D
#C6DDC6
#BE5F5A
#280021
#435743
#874514
#63675A
#E97963
#8F9C9E
#985262
#909081
#023508
#DDADBF
#D78493
#363900
#5B0120
#603C47
#C3955D
#AC61CB
#FD7BA7
#716C74
#8D895B
#071001
#82B4F2
#B6BBD8
#71887A
#8B9FE3
#997158
#65A6AB
#2E3067
#321301
#FEECCB
#3B5E72
#C8FE85
#A1DCDF
#CB49A6
#B1C5E4
#3E5EB0
#88AEA7
#04504C
#975232
#6786B9
#068797
#9A98C4
#A1C3C2
#1C3967
#DBEA07
#789658
#E7E7C6
#A6C886
#957F89
#752E62
#171518
#A75648
#01D26F
#0F535D
#047E76
#C54754
#5D6E88
#AB9483
#803B99
#FA9C48
#4A8A22
#654A5C
#965F86
#9D0CBB
#A0E8A0
#D3DBFA
#FD908F
#AEAB85
#A13B89
#F1B350
#066898
#948A42
#C8BEDE
#19252C
#7046AA
#E1EEFC
#3E6557
#CD3F26
#2B1925
#DDAD94
#C0B109
#37DFFE
#039676
#907468
#9E86A5
#3A1B49
#BEE5B7
#C29501
#9E3645
#DC580A
#645631
#444B4B
#FD1A63
#DDE5AE
#887800
#36006F
#3A6260
#784637
#FEA0B7
#A3E0D2
#6D6316
#5F7172
#B99EC7
#777A7E
#E0FEFD
#E16DC5
#01344B
#F8F8FC
#9F9FB5
#182617
#FE3D21
#7D0017
#822F21
#EFD9DC
#6E68C4
#35473E
#007523
#767667
#A6825D
#83DC5F
#227285
#A95E34
#526172
#979730
#756F6D
#716259
#E8B2B5
#B6C9BB
#9078DA
#4F326E
#B2387B
#888C6F
#314B5F
#E5B678
#38A3C6
#586148
#5C515B
#CDCCE1
#C8977F

무차별 대입을 사용하여 (CIELab Delta2000을 통해 모든 16,777,216 RGB 색상 테스트 / 검정으로 시작) 시리즈를 생성합니다. 약 26에서 충돌하기 시작하지만 육안 검사 및 수동 드롭으로 30 또는 40까지 만들 수 있습니다 (컴퓨터로는 수행 할 수 없음). 따라서 절대 최대 값을 프로그래밍 방식으로 수행하면 수십 개의 고유 한 색상 만 만들 수 있습니다. 이산 목록이 최선의 선택입니다. 프로그래밍 방식보다 목록에서 더 많은 개별 색상을 얻을 수 있습니다. 쉬운 방법은 최상의 솔루션입니다. 색상보다 데이터를 변경하는 다른 방법과 혼합 및 매칭을 시작하십시오.

최대한 다름

#000000
#00FF00
#0000FF
#FF0000
#01FFFE
#FFA6FE
#FFDB66
#006401
#010067
#95003A
#007DB5
#FF00F6
#FFEEE8
#774D00
#90FB92
#0076FF
#D5FF00
#FF937E
#6A826C
#FF029D
#FE8900
#7A4782
#7E2DD2
#85A900
#FF0056
#A42400
#00AE7E
#683D3B
#BDC6FF
#263400
#BDD393
#00B917
#9E008E
#001544
#C28C9F
#FF74A3
#01D0FF
#004754
#E56FFE
#788231
#0E4CA1
#91D0CB
#BE9970
#968AE8
#BB8800
#43002C
#DEFF74
#00FFC6
#FFE502
#620E00
#008F9C
#98FF52
#7544B1
#B500FF
#00FF78
#FF6E41
#005F39
#6B6882
#5FAD4E
#A75740
#A5FFD2
#FFB167
#009BFF
#E85EBE

업데이트 : 1024 무차별 대입으로 약 한 달 동안 계속했습니다. 1024

public static final String[] indexcolors = new String[]{
        "#000000", "#FFFF00", "#1CE6FF", "#FF34FF", "#FF4A46", "#008941", "#006FA6", "#A30059",
        "#FFDBE5", "#7A4900", "#0000A6", "#63FFAC", "#B79762", "#004D43", "#8FB0FF", "#997D87",
        "#5A0007", "#809693", "#FEFFE6", "#1B4400", "#4FC601", "#3B5DFF", "#4A3B53", "#FF2F80",
        "#61615A", "#BA0900", "#6B7900", "#00C2A0", "#FFAA92", "#FF90C9", "#B903AA", "#D16100",
        "#DDEFFF", "#000035", "#7B4F4B", "#A1C299", "#300018", "#0AA6D8", "#013349", "#00846F",
        "#372101", "#FFB500", "#C2FFED", "#A079BF", "#CC0744", "#C0B9B2", "#C2FF99", "#001E09",
        "#00489C", "#6F0062", "#0CBD66", "#EEC3FF", "#456D75", "#B77B68", "#7A87A1", "#788D66",
        "#885578", "#FAD09F", "#FF8A9A", "#D157A0", "#BEC459", "#456648", "#0086ED", "#886F4C",
        "#34362D", "#B4A8BD", "#00A6AA", "#452C2C", "#636375", "#A3C8C9", "#FF913F", "#938A81",
        "#575329", "#00FECF", "#B05B6F", "#8CD0FF", "#3B9700", "#04F757", "#C8A1A1", "#1E6E00",
        "#7900D7", "#A77500", "#6367A9", "#A05837", "#6B002C", "#772600", "#D790FF", "#9B9700",
        "#549E79", "#FFF69F", "#201625", "#72418F", "#BC23FF", "#99ADC0", "#3A2465", "#922329",
        "#5B4534", "#FDE8DC", "#404E55", "#0089A3", "#CB7E98", "#A4E804", "#324E72", "#6A3A4C",
        "#83AB58", "#001C1E", "#D1F7CE", "#004B28", "#C8D0F6", "#A3A489", "#806C66", "#222800",
        "#BF5650", "#E83000", "#66796D", "#DA007C", "#FF1A59", "#8ADBB4", "#1E0200", "#5B4E51",
        "#C895C5", "#320033", "#FF6832", "#66E1D3", "#CFCDAC", "#D0AC94", "#7ED379", "#012C58",
        "#7A7BFF", "#D68E01", "#353339", "#78AFA1", "#FEB2C6", "#75797C", "#837393", "#943A4D",
        "#B5F4FF", "#D2DCD5", "#9556BD", "#6A714A", "#001325", "#02525F", "#0AA3F7", "#E98176",
        "#DBD5DD", "#5EBCD1", "#3D4F44", "#7E6405", "#02684E", "#962B75", "#8D8546", "#9695C5",
        "#E773CE", "#D86A78", "#3E89BE", "#CA834E", "#518A87", "#5B113C", "#55813B", "#E704C4",
        "#00005F", "#A97399", "#4B8160", "#59738A", "#FF5DA7", "#F7C9BF", "#643127", "#513A01",
        "#6B94AA", "#51A058", "#A45B02", "#1D1702", "#E20027", "#E7AB63", "#4C6001", "#9C6966",
        "#64547B", "#97979E", "#006A66", "#391406", "#F4D749", "#0045D2", "#006C31", "#DDB6D0",
        "#7C6571", "#9FB2A4", "#00D891", "#15A08A", "#BC65E9", "#FFFFFE", "#C6DC99", "#203B3C",
        "#671190", "#6B3A64", "#F5E1FF", "#FFA0F2", "#CCAA35", "#374527", "#8BB400", "#797868",
        "#C6005A", "#3B000A", "#C86240", "#29607C", "#402334", "#7D5A44", "#CCB87C", "#B88183",
        "#AA5199", "#B5D6C3", "#A38469", "#9F94F0", "#A74571", "#B894A6", "#71BB8C", "#00B433",
        "#789EC9", "#6D80BA", "#953F00", "#5EFF03", "#E4FFFC", "#1BE177", "#BCB1E5", "#76912F",
        "#003109", "#0060CD", "#D20096", "#895563", "#29201D", "#5B3213", "#A76F42", "#89412E",
        "#1A3A2A", "#494B5A", "#A88C85", "#F4ABAA", "#A3F3AB", "#00C6C8", "#EA8B66", "#958A9F",
        "#BDC9D2", "#9FA064", "#BE4700", "#658188", "#83A485", "#453C23", "#47675D", "#3A3F00",
        "#061203", "#DFFB71", "#868E7E", "#98D058", "#6C8F7D", "#D7BFC2", "#3C3E6E", "#D83D66",
        "#2F5D9B", "#6C5E46", "#D25B88", "#5B656C", "#00B57F", "#545C46", "#866097", "#365D25",
        "#252F99", "#00CCFF", "#674E60", "#FC009C", "#92896B", "#1E2324", "#DEC9B2", "#9D4948",
        "#85ABB4", "#342142", "#D09685", "#A4ACAC", "#00FFFF", "#AE9C86", "#742A33", "#0E72C5",
        "#AFD8EC", "#C064B9", "#91028C", "#FEEDBF", "#FFB789", "#9CB8E4", "#AFFFD1", "#2A364C",
        "#4F4A43", "#647095", "#34BBFF", "#807781", "#920003", "#B3A5A7", "#018615", "#F1FFC8",
        "#976F5C", "#FF3BC1", "#FF5F6B", "#077D84", "#F56D93", "#5771DA", "#4E1E2A", "#830055",
        "#02D346", "#BE452D", "#00905E", "#BE0028", "#6E96E3", "#007699", "#FEC96D", "#9C6A7D",
        "#3FA1B8", "#893DE3", "#79B4D6", "#7FD4D9", "#6751BB", "#B28D2D", "#E27A05", "#DD9CB8",
        "#AABC7A", "#980034", "#561A02", "#8F7F00", "#635000", "#CD7DAE", "#8A5E2D", "#FFB3E1",
        "#6B6466", "#C6D300", "#0100E2", "#88EC69", "#8FCCBE", "#21001C", "#511F4D", "#E3F6E3",
        "#FF8EB1", "#6B4F29", "#A37F46", "#6A5950", "#1F2A1A", "#04784D", "#101835", "#E6E0D0",
        "#FF74FE", "#00A45F", "#8F5DF8", "#4B0059", "#412F23", "#D8939E", "#DB9D72", "#604143",
        "#B5BACE", "#989EB7", "#D2C4DB", "#A587AF", "#77D796", "#7F8C94", "#FF9B03", "#555196",
        "#31DDAE", "#74B671", "#802647", "#2A373F", "#014A68", "#696628", "#4C7B6D", "#002C27",
        "#7A4522", "#3B5859", "#E5D381", "#FFF3FF", "#679FA0", "#261300", "#2C5742", "#9131AF",
        "#AF5D88", "#C7706A", "#61AB1F", "#8CF2D4", "#C5D9B8", "#9FFFFB", "#BF45CC", "#493941",
        "#863B60", "#B90076", "#003177", "#C582D2", "#C1B394", "#602B70", "#887868", "#BABFB0",
        "#030012", "#D1ACFE", "#7FDEFE", "#4B5C71", "#A3A097", "#E66D53", "#637B5D", "#92BEA5",
        "#00F8B3", "#BEDDFF", "#3DB5A7", "#DD3248", "#B6E4DE", "#427745", "#598C5A", "#B94C59",
        "#8181D5", "#94888B", "#FED6BD", "#536D31", "#6EFF92", "#E4E8FF", "#20E200", "#FFD0F2",
        "#4C83A1", "#BD7322", "#915C4E", "#8C4787", "#025117", "#A2AA45", "#2D1B21", "#A9DDB0",
        "#FF4F78", "#528500", "#009A2E", "#17FCE4", "#71555A", "#525D82", "#00195A", "#967874",
        "#555558", "#0B212C", "#1E202B", "#EFBFC4", "#6F9755", "#6F7586", "#501D1D", "#372D00",
        "#741D16", "#5EB393", "#B5B400", "#DD4A38", "#363DFF", "#AD6552", "#6635AF", "#836BBA",
        "#98AA7F", "#464836", "#322C3E", "#7CB9BA", "#5B6965", "#707D3D", "#7A001D", "#6E4636",
        "#443A38", "#AE81FF", "#489079", "#897334", "#009087", "#DA713C", "#361618", "#FF6F01",
        "#006679", "#370E77", "#4B3A83", "#C9E2E6", "#C44170", "#FF4526", "#73BE54", "#C4DF72",
        "#ADFF60", "#00447D", "#DCCEC9", "#BD9479", "#656E5B", "#EC5200", "#FF6EC2", "#7A617E",
        "#DDAEA2", "#77837F", "#A53327", "#608EFF", "#B599D7", "#A50149", "#4E0025", "#C9B1A9",
        "#03919A", "#1B2A25", "#E500F1", "#982E0B", "#B67180", "#E05859", "#006039", "#578F9B",
        "#305230", "#CE934C", "#B3C2BE", "#C0BAC0", "#B506D3", "#170C10", "#4C534F", "#224451",
        "#3E4141", "#78726D", "#B6602B", "#200441", "#DDB588", "#497200", "#C5AAB6", "#033C61",
        "#71B2F5", "#A9E088", "#4979B0", "#A2C3DF", "#784149", "#2D2B17", "#3E0E2F", "#57344C",
        "#0091BE", "#E451D1", "#4B4B6A", "#5C011A", "#7C8060", "#FF9491", "#4C325D", "#005C8B",
        "#E5FDA4", "#68D1B6", "#032641", "#140023", "#8683A9", "#CFFF00", "#A72C3E", "#34475A",
        "#B1BB9A", "#B4A04F", "#8D918E", "#A168A6", "#813D3A", "#425218", "#DA8386", "#776133",
        "#563930", "#8498AE", "#90C1D3", "#B5666B", "#9B585E", "#856465", "#AD7C90", "#E2BC00",
        "#E3AAE0", "#B2C2FE", "#FD0039", "#009B75", "#FFF46D", "#E87EAC", "#DFE3E6", "#848590",
        "#AA9297", "#83A193", "#577977", "#3E7158", "#C64289", "#EA0072", "#C4A8CB", "#55C899",
        "#E78FCF", "#004547", "#F6E2E3", "#966716", "#378FDB", "#435E6A", "#DA0004", "#1B000F",
        "#5B9C8F", "#6E2B52", "#011115", "#E3E8C4", "#AE3B85", "#EA1CA9", "#FF9E6B", "#457D8B",
        "#92678B", "#00CDBB", "#9CCC04", "#002E38", "#96C57F", "#CFF6B4", "#492818", "#766E52",
        "#20370E", "#E3D19F", "#2E3C30", "#B2EACE", "#F3BDA4", "#A24E3D", "#976FD9", "#8C9FA8",
        "#7C2B73", "#4E5F37", "#5D5462", "#90956F", "#6AA776", "#DBCBF6", "#DA71FF", "#987C95",
        "#52323C", "#BB3C42", "#584D39", "#4FC15F", "#A2B9C1", "#79DB21", "#1D5958", "#BD744E",
        "#160B00", "#20221A", "#6B8295", "#00E0E4", "#102401", "#1B782A", "#DAA9B5", "#B0415D",
        "#859253", "#97A094", "#06E3C4", "#47688C", "#7C6755", "#075C00", "#7560D5", "#7D9F00",
        "#C36D96", "#4D913E", "#5F4276", "#FCE4C8", "#303052", "#4F381B", "#E5A532", "#706690",
        "#AA9A92", "#237363", "#73013E", "#FF9079", "#A79A74", "#029BDB", "#FF0169", "#C7D2E7",
        "#CA8869", "#80FFCD", "#BB1F69", "#90B0AB", "#7D74A9", "#FCC7DB", "#99375B", "#00AB4D",
        "#ABAED1", "#BE9D91", "#E6E5A7", "#332C22", "#DD587B", "#F5FFF7", "#5D3033", "#6D3800",
        "#FF0020", "#B57BB3", "#D7FFE6", "#C535A9", "#260009", "#6A8781", "#A8ABB4", "#D45262",
        "#794B61", "#4621B2", "#8DA4DB", "#C7C890", "#6FE9AD", "#A243A7", "#B2B081", "#181B00",
        "#286154", "#4CA43B", "#6A9573", "#A8441D", "#5C727B", "#738671", "#D0CFCB", "#897B77",
        "#1F3F22", "#4145A7", "#DA9894", "#A1757A", "#63243C", "#ADAAFF", "#00CDE2", "#DDBC62",
        "#698EB1", "#208462", "#00B7E0", "#614A44", "#9BBB57", "#7A5C54", "#857A50", "#766B7E",
        "#014833", "#FF8347", "#7A8EBA", "#274740", "#946444", "#EBD8E6", "#646241", "#373917",
        "#6AD450", "#81817B", "#D499E3", "#979440", "#011A12", "#526554", "#B5885C", "#A499A5",
        "#03AD89", "#B3008B", "#E3C4B5", "#96531F", "#867175", "#74569E", "#617D9F", "#E70452",
        "#067EAF", "#A697B6", "#B787A8", "#9CFF93", "#311D19", "#3A9459", "#6E746E", "#B0C5AE",
        "#84EDF7", "#ED3488", "#754C78", "#384644", "#C7847B", "#00B6C5", "#7FA670", "#C1AF9E",
        "#2A7FFF", "#72A58C", "#FFC07F", "#9DEBDD", "#D97C8E", "#7E7C93", "#62E674", "#B5639E",
        "#FFA861", "#C2A580", "#8D9C83", "#B70546", "#372B2E", "#0098FF", "#985975", "#20204C",
        "#FF6C60", "#445083", "#8502AA", "#72361F", "#9676A3", "#484449", "#CED6C2", "#3B164A",
        "#CCA763", "#2C7F77", "#02227B", "#A37E6F", "#CDE6DC", "#CDFFFB", "#BE811A", "#F77183",
        "#EDE6E2", "#CDC6B4", "#FFE09E", "#3A7271", "#FF7B59", "#4E4E01", "#4AC684", "#8BC891",
        "#BC8A96", "#CF6353", "#DCDE5C", "#5EAADD", "#F6A0AD", "#E269AA", "#A3DAE4", "#436E83",
        "#002E17", "#ECFBFF", "#A1C2B6", "#50003F", "#71695B", "#67C4BB", "#536EFF", "#5D5A48",
        "#890039", "#969381", "#371521", "#5E4665", "#AA62C3", "#8D6F81", "#2C6135", "#410601",
        "#564620", "#E69034", "#6DA6BD", "#E58E56", "#E3A68B", "#48B176", "#D27D67", "#B5B268",
        "#7F8427", "#FF84E6", "#435740", "#EAE408", "#F4F5FF", "#325800", "#4B6BA5", "#ADCEFF",
        "#9B8ACC", "#885138", "#5875C1", "#7E7311", "#FEA5CA", "#9F8B5B", "#A55B54", "#89006A",
        "#AF756F", "#2A2000", "#576E4A", "#7F9EFF", "#7499A1", "#FFB550", "#00011E", "#D1511C",
        "#688151", "#BC908A", "#78C8EB", "#8502FF", "#483D30", "#C42221", "#5EA7FF", "#785715",
        "#0CEA91", "#FFFAED", "#B3AF9D", "#3E3D52", "#5A9BC2", "#9C2F90", "#8D5700", "#ADD79C",
        "#00768B", "#337D00", "#C59700", "#3156DC", "#944575", "#ECFFDC", "#D24CB2", "#97703C",
        "#4C257F", "#9E0366", "#88FFEC", "#B56481", "#396D2B", "#56735F", "#988376", "#9BB195",
        "#A9795C", "#E4C5D3", "#9F4F67", "#1E2B39", "#664327", "#AFCE78", "#322EDF", "#86B487",
        "#C23000", "#ABE86B", "#96656D", "#250E35", "#A60019", "#0080CF", "#CAEFFF", "#323F61",
        "#A449DC", "#6A9D3B", "#FF5AE4", "#636A01", "#D16CDA", "#736060", "#FFBAAD", "#D369B4",
        "#FFDED6", "#6C6D74", "#927D5E", "#845D70", "#5B62C1", "#2F4A36", "#E45F35", "#FF3B53",
        "#AC84DD", "#762988", "#70EC98", "#408543", "#2C3533", "#2E182D", "#323925", "#19181B",
        "#2F2E2C", "#023C32", "#9B9EE2", "#58AFAD", "#5C424D", "#7AC5A6", "#685D75", "#B9BCBD",
        "#834357", "#1A7B42", "#2E57AA", "#E55199", "#316E47", "#CD00C5", "#6A004D", "#7FBBEC",
        "#F35691", "#D7C54A", "#62ACB7", "#CBA1BC", "#A28A9A", "#6C3F3B", "#FFE47D", "#DCBAE3",
        "#5F816D", "#3A404A", "#7DBF32", "#E6ECDC", "#852C19", "#285366", "#B8CB9C", "#0E0D00",
        "#4B5D56", "#6B543F", "#E27172", "#0568EC", "#2EB500", "#D21656", "#EFAFFF", "#682021",
        "#2D2011", "#DA4CFF", "#70968E", "#FF7B7D", "#4A1930", "#E8C282", "#E7DBBC", "#A68486",
        "#1F263C", "#36574E", "#52CE79", "#ADAAA9", "#8A9F45", "#6542D2", "#00FB8C", "#5D697B",
        "#CCD27F", "#94A5A1", "#790229", "#E383E6", "#7EA4C1", "#4E4452", "#4B2C00", "#620B70",
        "#314C1E", "#874AA6", "#E30091", "#66460A", "#EB9A8B", "#EAC3A3", "#98EAB3", "#AB9180",
        "#B8552F", "#1A2B2F", "#94DDC5", "#9D8C76", "#9C8333", "#94A9C9", "#392935", "#8C675E",
        "#CCE93A", "#917100", "#01400B", "#449896", "#1CA370", "#E08DA7", "#8B4A4E", "#667776",
        "#4692AD", "#67BDA8", "#69255C", "#D3BFFF", "#4A5132", "#7E9285", "#77733C", "#E7A0CC",
        "#51A288", "#2C656A", "#4D5C5E", "#C9403A", "#DDD7F3", "#005844", "#B4A200", "#488F69",
        "#858182", "#D4E9B9", "#3D7397", "#CAE8CE", "#D60034", "#AA6746", "#9E5585", "#BA6200"
    };

7
IMHO는 허용되는 답변보다 훨씬 낫습니다. 그리고 시각적 예와 미리 계산 된 목록에 +1!
Griddo 2014

1
또한 추가 된 색상과 세트에 이미있는 색상 사이에서 CIEDE2000을 최대화하기 위해 철저한 검색을 실행했습니다. 흑백은 미리 정의 된 색상입니다. 당신처럼 나는 두 가지 "피부 색조"를 일찍 얻습니다 : # ff9d25 (주황색으로 변함) 및 # ffb46c (분홍색으로 변함). 나는 그것들이 매우 비슷해 보이므로 CIEDE2000은 색상 차이 측정이 좋지 않을 수 있습니다. 현재로서는 더 나은 것이 없습니다. ... 16x16x16 (sRGB)의 그리드와 아마 첫째, 내 자신 방금 눈에 띄는 차분 실험을하고 시작하는 유혹
올리 Niemitalo

1024까지 올라갔지 만 한 달 넘게 걸렸습니다. 다른 색상 세트와 똑같이 실행할 수 있으며, 색 영역에 이르는 다양한 색상 세트가 있습니다. 그리고 실제로 CIEDE2000이 실제로 최고입니다. dE2k의 수정 사항 중 하나는 피부색이며, 우리에게 더 다르게 보이며 많은 기능에 더 중요합니다. 표준 dE는 실제보다 더 많이 다릅니다. 그리고 살구와 칙칙한 노란색은 꽤 다르게 보입니다. godsnotwheregodsnot.blogspot.com/2012/09/...
Tatarize

내가 볼 수있는 유일한 주요 개선점은 정적 목록입니다. 정확히 20 개의 색상 만 필요한 경우 다른 모든 색상에서 가장 먼 색상을 찾는 것이 실제로 최적이 아닐 수 있습니다. 클러스터링을 수행하고 세트의 모든 색상간에 색상 거리가 최대화되는 20 개의 색상을 찾은 경우 더 나은 결과를 얻을 수 있습니다. 이것은 실제로 여행하는 세일즈맨으로 바뀔 수 있으며 매우 비싼 색상 거리 알고리즘을 통해 무차별 대입 (2 ^ 24) ^ 20 시간이 오래 걸릴 수 있습니다. 그러나 좋은 클러스터링 알고리즘은 좋은 결과를 빠르게 제공 할 수 있습니다.
Tatarize

1
실제로 검사시 게시 된 그래픽의 마지막 두 개에 대해서는 수행하지 않았을 수도 있습니다. 그것을 생산하고 매번 새로운 이미지를 만들고 있었다. 그러나 그 시점에서 그것은 기본적으로 각각의 새로운 색상에 대해 단단하고 긴 시간 블록이었습니다. 그리고 그들이 크게 도움이되지 않았다는 완전한 이해.
Tatarize

23

절차 적으로 시각적으로 구별되는 색상을 생성하기 위해 온라인 페이지를 올렸습니다.
http://phrogz.net/css/distinct-colors.html

RGB 또는 HSV 공간 ( 축 값과 지각 차이 사이에 비선형 관계 가있는 경우)을 균등하게 가로 지르는 다른 답변과 달리 , 내 페이지는 표준 CMI (I : c) 색상 거리 알고리즘을 사용하여 두 색상이 너무 생기는 것을 방지합니다. 시각적으로 가깝습니다.

페이지의 마지막 탭을 사용하면 여러 가지 방법으로 값을 정렬 한 다음 인터리브 (순서 셔플)하여 매우 독특한 색상을 나란히 배치 할 수 있습니다.

이 글을 쓰는 현재, Firefox 용 shim이있는 Chrome 및 Safari에서만 잘 작동합니다. IE9 및 Firefox는 아직 기본적으로 지원하지 않는 인터페이스에서 HTML5 범위 입력 슬라이더를 사용합니다.


1
이것은 훌륭한 도구입니다. 제작 해 주셔서 감사합니다. 145 개의 고유 한 색상을 생성하는 데 사용했으며 고유 한 색상 도구가 만든 결과에 매우 만족합니다.
Malachy

아이디어는 좋지만 인터페이스가 어떻게 작동하는지 이해하지 못합니다. L a b 공간 에서 멀리 64 색을 생성하고 싶다면 어떤 설정을 사용해야합니까? 50 색 이상을 얻을 수 없습니다.
WIP

1
@wil Lab 페이지의 기본 설정은 선택할 수있는 480 색으로 시작합니다. 미세 조정 탭으로 이동하면 임계 값을 조정하여 더 많거나 적은 견본을 볼 수 있습니다.
Phrogz

36 가지 색상으로도 여전히 매우 유사한 색상을 얻을 수 있습니다.
Nemo 2011

8

여기에 HSV (또는 HSL) 공간이 더 많은 기회가 있다고 생각합니다 . 추가 변환이 마음에 들지 않으면 Hue 값을 회전하여 모든 색상을 살펴 보는 것이 매우 쉽습니다. 충분하지 않은 경우 채도 / 값 / 밝기 값을 변경하고 회전을 다시 진행할 수 있습니다. 또는 항상 색조 값을 이동하거나 "스테핑"각도를 변경하고 더 많이 회전 할 수 있습니다.


2
그러나 색조균등하게 밟아도 지각 적 분리가 이상적이지 않습니다.
Phrogz

4

이전 RGB 솔루션에 결함이 있습니다. 채널에 대해 색상 값과 0을 사용하기 때문에 전체 색상 공간을 활용하지 않습니다.

#006600
#330000
#FF00FF

대신 가능한 모든 색상 값을 사용하여 색상 채널에서 최대 3 개의 서로 다른 값을 가질 수있는 혼합 색상을 생성해야합니다.

#336600
#FF0066
#33FF66

전체 색상 공간을 사용하면보다 뚜렷한 색상을 생성 할 수 있습니다. 예를 들어 채널당 4 개의 값이있는 경우 4 * 4 * 4 = 64 색을 생성 할 수 있습니다. 다른 구성표에서는 4 * 7 + 1 = 29 색만 생성 할 수 있습니다.

N 색상을 원하는 경우 필요한 채널당 값 수는 다음과 같습니다. ceil (cube_root (N))

이를 통해 가능한 (0-255 범위) 값 (python)을 결정할 수 있습니다.

max = 255
segs = int(num**(Decimal("1.0")/3))
step = int(max/segs)
p = [(i*step) for i in xrange(segs)]
values = [max]
values.extend(p)

그런 다음 RGB 색상을 반복 할 수 있습니다 (권장되지 않음).

total = 0
for red in values:
  for green in values:
    for blue in values:
      if total <= N:
        print color(red, green, blue)
      total += 1

중첩 된 루프는 작동하지만 파란색 채널을 선호하고 결과 색상에 충분한 빨간색이 없기 때문에 권장되지 않습니다 (N은 가능한 모든 색상 값의 수보다 적을 가능성이 높습니다).

각 채널이 동일하게 처리되고 작은 색상보다 더 뚜렷한 색상 값이 선호되는 루프에 대해 더 나은 알고리즘을 만들 수 있습니다.

해결책이 있지만 이해하기 쉽고 효율적이지 않기 때문에 게시하고 싶지 않았습니다. 그러나 정말로 원한다면 솔루션을 볼 수 있습니다 .

다음은 64 개의 생성 된 색상 샘플입니다. 64 색


3

간단한 형태로 동일한 기능이 필요했습니다.

내가 필요한 것은 증가하는 인덱스 값에서 가능한 한 고유 한 색상을 생성하는 것이 었습니다.

다음은 C #의 코드입니다 (다른 모든 언어 구현은 매우 유사해야 함).

메커니즘은 매우 간단합니다

  1. 0에서 7까지의 indexA 값에서 color_writers 패턴이 생성됩니다.

  2. 인덱스가 8 미만인 경우 해당 색상은 = color_writer [indexA] * 255입니다.

  3. 8에서 15 사이의 인덱스의 경우 해당 색상은 = color_writer [indexA] * 255 + (color_writer [indexA + 1]) * 127입니다.

  4. 16에서 23 사이의 인덱스의 경우 해당 색상은 = color_writer [indexA] * 255 + (color_writer [indexA + 1]) * 127 + (color_writer [indexA + 2]) * 63입니다.

등등:

랜드 색상 생성기

    private System.Drawing.Color GetRandColor(int index)
    {
        byte red = 0;
        byte green = 0;
        byte blue = 0;

        for (int t = 0; t <= index / 8; t++)
        {
            int index_a = (index+t) % 8;
            int index_b = index_a / 2;

            //Color writers, take on values of 0 and 1
            int color_red = index_a % 2;
            int color_blue = index_b % 2;
            int color_green = ((index_b + 1) % 3) % 2;

            int add = 255 / (t + 1);

            red = (byte)(red+color_red * add);
            green = (byte)(green + color_green * add);
            blue = (byte)(blue + color_blue * add);
        }

        Color color = Color.FromArgb(red, green, blue);
        return color;
    }

참고 : 밝고보기 어려운 색상 (이 예에서는 흰색 배경에 노란색) 생성을 방지하려면 재귀 루프를 사용하여 수정할 수 있습니다.

    int skip_index = 0;
    private System.Drawing.Color GetRandColor(int index)
    {
        index += skip_index;
        byte red = 0;
        byte green = 0;
        byte blue = 0;

        for (int t = 0; t <= index / 8; t++)
        {
            int index_a = (index+t) % 8;
            int index_b = index_a / 2;

            //Color writers, take on values of 0 and 1
            int color_red = index_a % 2;
            int color_blue = index_b % 2;
            int color_green = ((index_b + 1) % 3) % 2;

            int add = 255 / (t + 1);

            red = (byte)(red + color_red * add);
            green = (byte)(green + color_green * add);
            blue = (byte)(blue + color_blue * add);
        }

        if(red > 200 && green > 200)
        {
            skip_index++;
            return GetRandColor(index);
        }

        Color color = Color.FromArgb(red, green, blue);
        return color;
    }

1

밝기를 100 %로 설정하고 먼저 기본 색상을 살펴 보겠습니다.

FF0000, 00FF00, 0000FF

그런 다음 조합

FFFF00, FF00FF, 00FFFF

예를 들어 밝기를 절반으로 줄이고 동일한 라운드를 수행합니다. 정말 명확하게 구별되는 색상이 너무 많지 않습니다. 이후 선 너비를 변경하고 점선 / 점선 등을하기 시작합니다.


1
+1은 색상 대신 다른 선 스타일을 사용하는 훌륭한 제안입니다.
Iiridayn

1

이 알고리즘을 더 짧은 방법으로 구현했습니다.

void ColorValue::SetColorValue( double r, double g, double b, ColorType myType )
{
   this->c[0] = r;
   this->c[1] = g;
   this->c[2] = b;

   this->type = myType;
}


DistinctColorGenerator::DistinctColorGenerator()
{
   mFactor = 255;
   mColorsGenerated = 0;
   mpColorCycle = new ColorValue[6];
   mpColorCycle[0].SetColorValue( 1.0, 0.0, 0.0, TYPE_RGB);
   mpColorCycle[1].SetColorValue( 0.0, 1.0, 0.0, TYPE_RGB);
   mpColorCycle[2].SetColorValue( 0.0, 0.0, 1.0, TYPE_RGB);
   mpColorCycle[3].SetColorValue( 1.0, 1.0, 0.0, TYPE_RGB);
   mpColorCycle[4].SetColorValue( 1.0, 0.0, 1.0, TYPE_RGB);
   mpColorCycle[5].SetColorValue( 0.0, 1.0, 1.0, TYPE_RGB);
}

//----------------------------------------------------------

ColorValue DistinctColorGenerator::GenerateNewColor()
{
   int innerCycleNr = mColorsGenerated % 6;
   int outerCycleNr = mColorsGenerated / 6;
   int cycleSize = pow( 2, (int)(log((double)(outerCycleNr)) / log( 2.0 ) ) );
   int insideCycleCounter = outerCycleNr % cyclesize;

   if ( outerCycleNr == 0)
   {
      mFactor = 255;
   }
   else
   {
      mFactor = ( 256 / ( 2 * cycleSize ) ) + ( insideCycleCounter * ( 256 / cycleSize ) );
   }

   ColorValue newColor = mpColorCycle[innerCycleNr] * mFactor;

   mColorsGenerated++;
   return newColor;
}

0

색 공간을 0에서 255까지의 세 숫자 조합으로 생각할 수도 있습니다. 이것은 0에서 255 ^ 3 사이의 숫자를 기본 255로 표현한 것이며, 소수점 세 자리를 갖도록 강제합니다 (필요한 경우 끝에 0을 추가).

따라서 x 개의 색상을 생성하려면 0에서 100까지의 균등 한 간격의 백분율 x를 계산합니다.이 백분율에 255 ^ 3을 곱하여 숫자를 얻고이 숫자를 밑이 255로 변환 한 다음 앞에서 언급 한대로 0을 추가합니다.

참조 용 기본 변환 알고리즘 (C #에 매우 가까운 의사 코드) :

int num = (number to convert);
int baseConvert = (desired base, 255 in this case);
(array of ints) nums = new (array of ints);
int x = num;
double digits = Math.Log(num, baseConvert); //or ln(num) / ln(baseConvert)
int numDigits = (digits - Math.Ceiling(digits) == 0 ? (int)(digits + 1) : (int)Math.Ceiling(digits)); //go up one if it turns out even
for (int i = 0; i < numDigits; i++)
{
  int toAdd = ((int)Math.Floor(x / Math.Pow((double)convertBase, (double)(numDigits - i - 1))));
  //Formula for 0th digit: d = num / (convertBase^(numDigits - 1))
  //Then subtract (d * convertBase^(numDigits - 1)) from the num and continue
  nums.Add(toAdd);
  x -= toAdd * (int)Math.Pow((double)convertBase, (double)(numDigits - i - 1));
}
return nums;

원하는 경우 흰색과 검정색을 피하기 위해 범위를 약간 가져 오기 위해 무언가를해야 할 수도 있습니다. 이 숫자는 실제로 부드러운 색상 스케일은 아니지만 너무 많지 않으면 별도의 색상을 생성합니다.

이 질문 에는 .NET의 기본 변환에 대한 자세한 내용 있습니다.


0

n 번째 색상을 얻기 위해. 이런 종류의 코드만으로도 충분합니다. 이것은 내 opencv 클러스터링 문제에 사용되었습니다. 열이 변경되면 다른 색상이 생성됩니다.

for(int col=1;col<CLUSTER_COUNT+1;col++){
switch(col%6)
   {
   case 1:cout<<Scalar(0,0,(int)(255/(int)(col/6+1)))<<endl;break;
   case 2:cout<<Scalar(0,(int)(255/(int)(col/6+1)),0)<<endl;break;
    case 3:cout<<Scalar((int)(255/(int)(col/6+1)),0,0)<<endl;break;
    case 4:cout<<Scalar(0,(int)(255/(int)(col/6+1)),(int)(255/(int)(col/6+1)))<<endl;break;
    case 5:cout<<Scalar((int)(255/(int)(col/6+1)),0,(int)(255/(int)(col/6+1)))<<endl;break;
    case 0:cout<<Scalar((int)(255/(int)(col/6)),(int)(255/(int)(col/6)),0)<<endl;break;
   }
}

0

누군가 C #에서 흰색 전경에 대해 임의의 중간에서 높은 어두운 색상을 생성해야하는 경우 다음 코드가 있습니다.

[DllImport("shlwapi.dll")]
public static extern int ColorHLSToRGB(int H, int L, int S);

public static string GetRandomDarkColor()
{
    int h = 0, s = 0, l = 0;
    h = (RandomObject.Next(1, 2) % 2 == 0) ? RandomObject.Next(0, 180) : iApp.RandomObject.Next(181, 360);
    s = RandomObject.Next(90, 160);
    l = RandomObject.Next(80, 130);

    return System.Drawing.ColorTranslator.FromWin32(ColorHLSToRGB(h, l, s)).ToHex();
}

private static string ToHex(this System.Drawing.Color c)
{
    return "#" + c.R.ToString("X2") + c.G.ToString("X2") + c.B.ToString("X2");
}

RandomObject자신의 Random클래스 개체로 바꿀 수 있습니다 .


-3

3255 값의 무작위 세트를 가져와 마지막 3 값 세트와 비교하여 사용하기 전에 이전 값에서 각각 적어도 X 떨어져 있는지 확인할 수 있습니다.

이전 : 190, 120, 100

신규 : 180, 200, 30

X = 20이면 새 세트가 다시 생성됩니다.


나는 수학을하고 더 이상 해결책이 없을 때이 알고리즘이 무한 루프에 들어가기까지 평균적으로 얼마나 오래 걸릴지 계산할만큼 충분히 궁금합니다.
Tatarize

흠. 이상하게으로 당신의 대답은 말한다 모든 너무 가까이 다른 R 값과 R 값이 가장에서 12보다 작지의 재생을하게됩니다. 이상하게도 빨간색과 파란색은 모두 20 이내의 녹색이 0이기 때문에 너무 가깝다고 부르 겠지만 말 그대로 예를 들면 다음과 같습니다. colorcodehex.com/be7864 colorcodehex.com/b4c81e 너무 가깝고 다시 생성해야합니다.
Tatarize
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.