C # Как сохранить 1 диапазон цветов в растровом изображении? - PullRequest
0 голосов
/ 08 мая 2019

Так что в c # у меня есть изображение в растровом изображении с различными цветами в нем. Теперь я пытаюсь сохранить только один диапазон цветов на изображении, а все остальные можно удалить (превратить их в белые пиксели). Теперь цвет, который я хочу извлечь, - желтый, но просто сравнивая пиксели и их цвет с цветом. Желтого не хватит, поскольку пиксели могут иметь разные оттенки желтого цвета, поэтому я полагаю, что мне нужно отфильтровать все остальные цвета, но Я не могу понять, как это сделать.

Я читал кое-что о свертке, но не вижу способа внедрить это непосредственно в программу.

Есть ли способ, благодаря которому я могу сохранить только желтый цвет и его оттенки на изображении?

Заранее спасибо.

Ответы [ 2 ]

1 голос
/ 09 мая 2019

Вот быстрое и простое решение.

Используется функция, которая будет плагин с постом, который вы можете найти здесь .

Это функция:

public Color ToWhiteExceptYellow(Color c, int range)
{
    float hueC = c.GetHue();
    float e = 1.5f * range;   // you can adapt this nuumber
    float hueY = Color.Yellow.GetHue();
    float delta = hueC - hueY;
    bool ok = (Math.Abs(delta) < e);
    //if (!ok) { ok = (Math.Abs(360 + delta) < e); }  // include these lines ..
    //if (!ok) { ok = (Math.Abs(360 - delta) < e); }  // for reddish colors!

    return ok ? c : Color.White;
}

Хорошо работает с желтым, но поскольку цветовые оттенки - это обтекание число , ему потребуется больше кода для работы сцвет точки обтекания (красный).Я добавил две строки, чтобы помочь.

Чтобы это работало, измените эти строки в связанном посте:

// pick one of our filter methods
ModifyHue hueChanger = new ModifyHue(ToWhiteExceptYellow);

.. и ..

// we pull the bitmap from the image
Bitmap bmp = new Bitmap( (Bitmap)pictureBox1.Image);  // create a copy

..и ..

c = hueChanger(c, trackBar1.Value);  // insert a number you like, mine go from 1-10

.. и ..:

// we need to re-assign the changed bitmap
pictureBox2.Image = (Bitmap)bmp;   // show in a 2nd picturebox

Не забудьте включить делегата:

public delegate Color ModifyHue(Color c, int ch);

и использованиепредложение:

using System.Drawing.Imaging;

Обратите внимание, что нужно избавиться от старого контента, чтобы избежать утечки изображений, например, так:

Bitmap dummy = (Bitmap )pictureBox2.Image;
pictureBox2.Image = null;
if (dummy != null) dummy.Dispose;
// now assign the new image!

Давайте посмотрим на это:

enter image description here

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

1 голос
/ 08 мая 2019

очень расплывчатое определение, если бы я понял, что вы хотите сделать, я бы сделал это так:

  1. Выполните итерацию по каждому пикселю растрового изображения и сравните его с желтым диапазоном (если снаружи - назначьте значение белого)
  2. Преобразовать значение RGB каждого пикселя в CMYK (поиск в Интернете для формулы преобразования) [Y = (1-синий-черный) / (1-черный)]
  3. Назначить значение белого, если YellowMin

Свертка вам не поможет, она действует в пространственной области, а не в цвете

...