Как я уменьшаю битовый массив до известного набора цветов RGB

Простейшим способом было бы использовать условие разрыва. Циклы повторяются по блоку кода, пока выражение не станет ложным. Поскольку ваше выражение всегда истинно, необходимо использовать break для завершения текущей итерации / цикла.

   while True:
        userInput = input("Pass:")
        if userInput == password: 
            print("Correct, welcome to Fahuk Console.")
            print("Type \"help\" for a list of commands.")
            userInput = input("-")
            break
        else:
            print("Incorrect password.") ```
8
задан random 8 August 2009 в 02:25
поделиться

6 ответов

Используйте цветовое пространство LAB и найдите цвет с ближайшим евклидовым расстоянием. Выполнение этого в цветовом пространстве RGB приведет к парадоксальным результатам. (Или используйте цветовое пространство HSL.)

Поэтому просто выполните итерации по каждому пикселю и найдите цвет с самым близким расстоянием в цветовом пространстве, которое Вы выбираете. Обратите внимание, что расстояние должно быть вычислено циркулярное для некоторых цветовых пространств (например, те, которые используют оттенок).

(Большая часть цвета quanization вращается вокруг фактического выбора палитры, но это уже заботилось о в Вашем случае, таким образом, Вы не можете использовать более популярные методы квантования.)

Кроме того, проверьте этот вопрос.

Для нахождения оттенка HSB в Какао похоже, что можно использовать getHue метод, объявленный в NSColor.h.

Однако, если Вы просто преобразуете изображение в вышитый крестиком дизайн с помощью этой техники, то будет очень трудно на самом деле сшить его. Это будет полно полей цвета единственного пикселя, который вид поражений цель вышить крестиком.

10
ответ дан 5 December 2019 в 10:44
поделиться

Это называют цветным квантованием, и существует много доступных алгоритмов.

Одно очень простое должно просто рассматривать цвета RGB как точки в пространстве и использовать простое Евклидово расстояние между цветами, чтобы выяснить, как "близко" они. Это имеет недостатки, так как человеческие глаза имеют другую чувствительность в различных местах в этом пространстве, таким образом, такое расстояние не соответствовало бы хорошо тому, как люди чувствуют цвета. Можно использовать различные планы взвешивания улучшить ту ситуацию.

3
ответ дан 5 December 2019 в 10:44
поделиться

получите источник для ppmquant приложение от netpbm набор утилит

1
ответ дан 5 December 2019 в 10:44
поделиться

В зависимости от уместности правильности Ваших цветных операций не забудьте принимать цветовые пространства во внимание. В то время как я изучил это несколько, из-за моего хобби фотографии, я все еще немного смущен всем.

Но, так же ранее упомянутые, используйте LAB как можно больше, потому что (afaik), это - агностик цветового пространства, в то время как все другие методы (RGB/HSL/CMYK) ничего не означают (в теории) без определенного цветового пространства.

RGB, например, является всего трехпроцентными значениями (0-255 => 0-100% с 8-разрядной глубиной цвета). Так, если у Вас есть триплет RGB (0,255,0), он переводит в "только зеленый, и как можно больше его". Так, вопрос, "как красный является красным?". Это - вопрос, на который цветовое пространство отвечает - sRGB 100%-green не является столь же зеленым как AdobeRGB 100%-green. Это даже не тот же оттенок!

Извините, если это перешло к offtopic стороне вещей

-1
ответ дан 5 December 2019 в 10:44
поделиться

Другие указали на различные методы для цветного квантования. Возможно использовать методы как Случайные поля Маркова, чтобы попытаться оштрафовать систему за переключение цветов потока в соседних пиксельных районах. Существует некоторая универсальная мультимаркировка библиотеки MRF там включая Boykov.

Для использования одного из них элементы данных были бы входными цветами, маркировки будут набором цветов потока, условия данных могли быть чем-то как Евклидово расстояние в пространстве LAB, предложенном bzlm, и условия окружения оштрафуют за переключение цветов потока.

1
ответ дан 5 December 2019 в 10:44
поделиться

Межотдых... :)

Вы не только определили бы ближайшие цвета, Вы также захотите сократить количество используемых цветов. Вы не хотите заканчивать с шаблоном сшивания, который использует сотни различных цветов...

Я соединил некоторый код, который делает это на базовом уровне. (Извините, что это находится в 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);
2
ответ дан 5 December 2019 в 10:44
поделиться
Другие вопросы по тегам:

Похожие вопросы: