문제

취미를 위해 프로젝트를 구축하는 프로그램을 때 주어지는 비트맵 이미지를 만들 것 만으로 쉽다.I'll be 코코아를 사용하여/목표 C Mac.

소스트맵는 일반적으로 24bpp 이미지의 수백만의 색상을 사용할 수 있는,단지 몇 가지가 존재로운 스레드입니다.스레드에 다양한 형식입니다.DMC 가장 널리 사용할 수 있고,거의 그들의 전체 범위에으로 사용할 수 있는 RGB 값을에서 다양한 웹 사이트입니다. 여기서 한가, 한 인스턴스입니다.

DMC#  Name               R   G   B
----- ------------------ --- --- ---
blanc White              255 255 255
208   Lavender - vy dk   148  91 128
209   Lavender - dk      206 148 186
210   Lavender - md      236 207 225
211   Lavender - lt      243 218 228
      ...etc...

내 처음 문제를 볼로,그것은에서 시작점의 RGB 에서 픽셀에서 이미지를 선택하는 가장 가까운 색상에서 사용할 수 있 DMC 설정합니다.최선의 방법은 무엇일을 찾는 가장 가까운 이는 색상을 수학적으로,그리고 손님들은 그것의 가까운으로 맞는 컬러는 너무?

하지만 나는 코코아를 사용하여,사용하시기 바랍 의사 코드(거나 심지어는 자바!) 에 모든 코드를 게시합니다.

도움이 되었습니까?

해결책

실험 색상 공간과 색깔을 찾을과 가장 가까운 유클리드 거리.이렇게 RGB 색상 공간에서 얻을 것입니다 카운터-직관적인 결과입니다.(또는 사용 HSL 색상 공간입니다.)

그래서 그냥 통해 반복하는 각 픽셀을 찾으로 색을 가장 가까운 거리에서 컬러 공간에 당신이 선택합니다.참고로부터 멀리 떨어져 있 계산 원형으로 어떤 색상 공간(예:그 사용하는 hue).

(대부분의 색깔 quanization 의 주위에 회귀한 실제로 선택한 팔레트,하지만 그는 이미지의 경우에,그래서 당신이 사용할 수 없습니다 더 인기 있는 양자화 기법입니다.)

또한,체크 아웃 이 질문.

을 찾 HSB 색상에서 코코아,그것은 다음과 같 사용할 수 있습니다 getHue 방법에 선언된 NSColor.h.

그러나,당신을 변환하는 이미지를 크로스-스티치 디자인 이 기술을 이용하여,그것은 매우 어려운 것입니다 실제로 그것을 스티치. 그것의 전체 될 것입니다 하나의 픽셀의 색상 분야는 종류의 목적을 패배의 십자가 바느질되어 있습니다.

다른 팁

색상 양자화, 고,많은 알고리즘을 사용할 수 있다.

하나의 아주 기본적인은 치료 RGB 색상으로 포인트 공간에서 사용하고,일반 old 유클리드 사이의 거리 색상의 방법"닫기"그들이 있습니다.이것은 단점 때문에 인간의 눈이 다른 민감도에서 다른 장소로 이 공간에서,그래서 그런 거리지 않을 것에 해당하 잘하는 방법을 인식하게 됩니다.당신이 사용할 수 있는 다양한 가중치 계획을 개선하는 상황이다.

Interresting...:)

당신만을 식별하는 가장 가까운 색상,당신은 또한 수를 줄이는 색상이 사용됩니다.당신이 원하지 않을 끝으로 바느질하는 패턴을 사용하는 다양한 색상의 수백을...

내가 함께 몇 가지는 코드가 이 기본적인 수준에서.(미안하는 그것의 C#,나 희망이 될 수 있다는 어느 정도 도움입니다.)

몇 가지 추가 조정될 필요가 있는지기 전에 수행 방법은,물론입니다.이 GetDistance 방법에는 무게의 중요성은 색조,채도,밝기,서로에 대한 최적의 균형을 찾는 사람들입니다 물론 중요한을 찾기 위해서는 컬러는 가장 가깝습니다.

또한 많은에서 할 수 있는 방법을 감소시키는 팔레트에 있습니다.예에서 나는 그냥 집어 가장 많이 사용되는 색상이지만,아마 당신이 원하는 무게는 어떻게 모두 색상 팔레트에서.이 수행할 수 있습을 선택하여 가장 많이 사용되는 색상을 줄이고,카운 나머지에 대한 색상에 따라 목록에서의 거리를 선택 색상,그리고 그런 다음 리조트에는 목록에 있습니다.

Hsl 는 클래스를 보유하고 DMC,색채의 거리를 계산하는 다른 색깔과 가장 가까운 색상으로 목록에서의 색상:

public class Hsl {

    public string DmcNumber { get; private set; }
    public Color Color { get; private set; }
    public float Hue { get; private set; }
    public float Saturation { get; private set; }
    public float Brightness { get; private set; }
    public int Count { get; set; }

    public Hsl(Color c) {
        DmcNumber = "unknown";
        Color = c;
        Hue = c.GetHue();
        Saturation = c.GetSaturation();
        Brightness = c.GetBrightness();
        Count = 0;
    }

    public Hsl(string dmc, int r, int g, int b)
        : this(Color.FromArgb(r, g, b))
    {
        DmcNumber = dmc;
    }

    private static float AngleDifference(float a1, float a2) {
        float a = Math.Abs(a1 - a2);
        if (a > 180f) {
            a = 360f - a;
        }
        return a / 180f;
    }

    public float GetDistance(Hsl other) {
        return
            AngleDifference(Hue, other.Hue) * 3.0f +
            Math.Abs(Saturation - other.Saturation) +
            Math.Abs(Brightness - other.Brightness) * 4.0f;
    }

    public Hsl GetNearest(IEnumerable<Hsl> dmcColors) {
        Hsl nearest = null;
        float nearestDistance = float.MaxValue;
        foreach (Hsl dmc in dmcColors) {
            float distance = GetDistance(dmc);
            if (distance < nearestDistance) {
                nearestDistance = distance;
                nearest = dmc;
            }
        }
        return nearest;
    }

}

이 코드는 설정(크게 감소)목록의 DMC,색상에서는 이미지,계산 색상 감소,팔레트로 변환합니다.당신은 물론 또한 원하는 정보를 저장에서 감소 팔레트는 곳이다.

Hsl[] dmcColors = {
    new Hsl("blanc", 255, 255, 255),
    new Hsl("310", 0, 0, 0),
    new Hsl("317", 167, 139, 136),
    new Hsl("318", 197, 198, 190),
    new Hsl("322", 81, 109, 135),
    new Hsl("336", 36, 73, 103),
    new Hsl("413", 109, 95, 95),
    new Hsl("414", 167, 139, 136),
    new Hsl("415", 221, 221, 218),
    new Hsl("451", 179, 151, 143),
    new Hsl("452", 210, 185, 175),
    new Hsl("453", 235, 207, 185),
    new Hsl("503", 195, 206, 183),
    new Hsl("504", 206, 221, 193),
    new Hsl("535", 85, 85, 89)
};

Bitmap image = (Bitmap)Image.FromFile(@"d:\temp\pattern.jpg");

// count colors used
List<Hsl> usage = new List<Hsl>();
for (int y = 0; y < image.Height; y++) {
    for (int x = 0; x < image.Width; x++) {
        Hsl color = new Hsl(image.GetPixel(x, y));
        Hsl nearest = color.GetNearest(dmcColors);
        int index = usage.FindIndex(h => h.Color.Equals(nearest.Color));
        if (index != -1) {
            usage[index].Count++;
        } else {
            nearest.Count = 1;
            usage.Add(nearest);
        }
    }
}

// reduce number of colors by picking the most used
Hsl[] reduced = usage.OrderBy(c => -c.Count).Take(5).ToArray();

// convert image
for (int y = 0; y < image.Height; y++) {
    for (int x = 0; x < image.Width; x++) {
        Hsl color = new Hsl(image.GetPixel(x, y));
        Hsl nearest = color.GetNearest(reduced);
        image.SetPixel(x, y, nearest.Color);
    }
}

image.Save(@"d:\temp\pattern.png", System.Drawing.Imaging.ImageFormat.Png);

을 얻을 원 ppmquant 에서 응용 프로그램 netpbm 설정의 유틸리티

다른 사람들이 지적 다양한 기법에 대한 컬러한 양자화.그것은 가능한 기술을 사용하기 위하여 다음과 같 Markov 무작위 분야를 시도하는 불이익에 대한 시스템 스위칭 스레드 색상에서 이웃 픽셀의 위치입니다.거기에 몇 가지 일반 multi-label MRF 라이브러리가 포함 Boykov 의.

중 하나를 사용하려면 이러한 데이터 요소는 것 입력 색상 라벨 설정의 스레드 색상,데이터 조건 수 있습 같은 것이 유클리드 거리에서 실험실 공간을 제안하여 bzlm 며,지역 기간이 처벌 전환을 위한 스레드 색상입니다.

에 따라 관련성을 정확성의 색상의 작업을 기억 색상 공간s 있습니다.나는 공부한 이 다소로 인해 내 사진 취미,난 아직 약간의 혼란에 대한 모든 것입니다.

하지만,앞서 언급했듯이,사용 실험실,가능한 한 많기 때문에(afaik)그것은 컬러 공간에 상관없이 모든 다른 방법(RGB/HSL/CMYK)아무 의미가 없(이론)지 않고는 정의된 색상 공간입니다.

RGB,예를 들어 단지 세 가지 비율 값(0-255=>0-100%8 비트 색상).그래서,당신이 있는 경우 RGB-삼중의(0,255,0),변환기"녹색,그리고 많이 그것으로 가능한".그래서 질문은"어떻게 빨간이 빨간색입니까?".이 질문에는 컬러 공간에 응답- sRGB 100%-녹색되지 않은 녹색으로 AdobeRGB 100%-녹색입니다.그것은 심지어 동 hue!

죄송하는 경우 이에 갔 논외면의 것

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top