Как Заменить Пиксельный цвет другим цветом в Изображении?

У меня есть Изображение, и я могу Рид все, что это - Пиксельное использование цветов Martix... Как я могу изменить RGB для какого-либо Пикселя, Если я хочу преобразовать его в самый близкий цвет от (Черный, Красный или белый)

Мой Кодекс, чтобы Прочитать Изображение в Матрице:

string sourceimg = @"D:\ProductionTools\Taskes\Image Processing\Test\001.jpg";
//...
Bitmap imageoriginal = new Bitmap(sourceimg);
int height = imageoriginal.Height;
int width = imageoriginal.Width;
Color[][] colormatrix = new Color[width][];
for (int i = 0; i < width; i++) {
    colormatrix[i] = new Color[height];
    for (int j = 0; j < height; j++) {
        colormatrix[i][j] = new Color();
        colormatrix[i][j] = imageoriginal.GetPixel(i, j);
    }
}  
3
@DmitryG: Хотя it' s мило с вашей стороны, чтобы зафиксировать OP' s заказывающий, пожалуйста don' t берут его на себя, чтобы "зафиксировать" его бодрящий стиль.
добавлено автор Rawling, источник
@Rawling i' ve, просто используя мой инструмент форматирования... так или иначе, я попытаюсь следовать с этой рекомендацией в будущем
добавлено автор DmitryG, источник
@Rawling i' ve, просто используя мой инструмент форматирования... так или иначе, я попытаюсь следовать с этой рекомендацией в будущем
добавлено автор DmitryG, источник
Ваш вопрос на самом деле о цветном расстоянии, которое проблематично, чтобы сделать в RGB. При использовании типичное евклидово расстояние между, утраивается (R1, G1, B2) и (R2, G2, B2) , вы испытаете затруднения даже из-за этого простого приложения. Кроме того, (128, 128, 128) ближе черному (0, 0, 0) или белому (255, 255, 255) ?
добавлено автор mmgp, источник
Ваш вопрос на самом деле о цветном расстоянии, которое проблематично, чтобы сделать в RGB. При использовании типичное евклидово расстояние между, утраивается (R1, G1, B2) и (R2, G2, B2) , вы испытаете затруднения даже из-за этого простого приложения. Кроме того, (128, 128, 128) ближе черному (0, 0, 0) или белому (255, 255, 255) ?
добавлено автор mmgp, источник

6 ответы

As pointed out in your comments, the question is about color distance, which is not a trivial matter. It also relates to which colorspace you use, so here I will show you examples in RGB, HSV, HLS, and CIELAB. Also, to calculate distance you need a formula. For simplicity, let's sticky to the euclidean distance, as in enter image description here

Затем, чтобы тривиально ответить на ваш вопрос, вы вычисляете расстояние от текущего цвета q к трем целям пи , вы имеете (черный, красный, и белый). Наименьшее расстояние указывает на цвет, которым вы заменяете. В случае связи я держу самый ранний цвет, который дал минимальное расстояние.

Теперь, цветовое пространство также очень важно в этой задаче, так как это устанавливает значение для евклидова расстояния. Вот типовое изображение:

enter image description here

Преобразованный в RGB:

enter image description here

Преобразованный в HLS (т.е., цвет RGB преобразовывается в HLS и расстояние, вычисляется):

enter image description here

HSV:

enter image description here

CIELAB:

enter image description here

5
добавлено
Ха. Теперь я хочу пойти, пробуют мой код и видят то, что он делает>.>
добавлено автор Rawling, источник
Достаточно ярмарка... как красная является обычно нулевым оттенком есть некоторые very-slightly-purply красные, которые, вероятно, установлены в черный или белый, тогда.
добавлено автор Rawling, источник
Мой код дает результат больше всего как ваш HSV, я думаю. NB на вашей оси "оттенка", вы не забываете обертывать его вокруг?
добавлено автор Rawling, источник
Да, конечно. В этом случае вы используете определенное расстояние для определенной цветовой системы, которая прекрасна (и мог привести к лучшим результатам). Для CIELAB самая простая функция Delta E - евклидово расстояние, так, чтобы могла быть другая причина того, почему я нахожу результаты лучше в этом цветовом пространстве (матчи функции расстояния, на что цветовое пространство указывает как расстояние). Проблема - это I' m не знающий о любом глобально принятом расстоянии функционирует для других цветовых систем.
добавлено автор mmgp, источник
@Rawling вы имеете в виду в смысле полагать, что синий оттенок ближе к красному, чем к зеленому оттенку? Я didn' t, это было прямое фиктивное евклидово расстояние между, утраивается, который doesn' t рассматривают особое поведение цветовых пространств.
добавлено автор mmgp, источник
Мне особенно нравятся результаты в CIELAB.
добавлено автор mmgp, источник

As pointed out in your comments, the question is about color distance, which is not a trivial matter. It also relates to which colorspace you use, so here I will show you examples in RGB, HSV, HLS, and CIELAB. Also, to calculate distance you need a formula. For simplicity, let's sticky to the euclidean distance, as in enter image description here

Затем, чтобы тривиально ответить на ваш вопрос, вы вычисляете расстояние от текущего цвета q к трем целям пи , вы имеете (черный, красный, и белый). Наименьшее расстояние указывает на цвет, которым вы заменяете. В случае связи я держу самый ранний цвет, который дал минимальное расстояние.

Теперь, цветовое пространство также очень важно в этой задаче, так как это устанавливает значение для евклидова расстояния. Вот типовое изображение:

enter image description here

Преобразованный в RGB:

enter image description here

Преобразованный в HLS (т.е., цвет RGB преобразовывается в HLS и расстояние, вычисляется):

enter image description here

HSV:

enter image description here

CIELAB:

enter image description here

5
добавлено
Ха. Теперь я хочу пойти, пробуют мой код и видят то, что он делает>.>
добавлено автор Rawling, источник
Мой код дает результат больше всего как ваш HSV, я думаю. NB на вашей оси "оттенка", вы не забываете обертывать его вокруг?
добавлено автор Rawling, источник
Достаточно ярмарка... как красная является обычно нулевым оттенком есть некоторые very-slightly-purply красные, которые, вероятно, установлены в черный или белый, тогда.
добавлено автор Rawling, источник
Да, конечно. В этом случае вы используете определенное расстояние для определенной цветовой системы, которая прекрасна (и мог привести к лучшим результатам). Для CIELAB самая простая функция Delta E - евклидово расстояние, так, чтобы могла быть другая причина того, почему я нахожу результаты лучше в этом цветовом пространстве (матчи функции расстояния, на что цветовое пространство указывает как расстояние). Проблема - это I' m не знающий о любом глобально принятом расстоянии функционирует для других цветовых систем.
добавлено автор mmgp, источник
@Rawling вы имеете в виду в смысле полагать, что синий оттенок ближе к красному, чем к зеленому оттенку? Я didn' t, это было прямое фиктивное евклидово расстояние между, утраивается, который doesn' t рассматривают особое поведение цветовых пространств.
добавлено автор mmgp, источник
Мне особенно нравятся результаты в CIELAB.
добавлено автор mmgp, источник

As pointed out in your comments, the question is about color distance, which is not a trivial matter. It also relates to which colorspace you use, so here I will show you examples in RGB, HSV, HLS, and CIELAB. Also, to calculate distance you need a formula. For simplicity, let's sticky to the euclidean distance, as in enter image description here

Затем, чтобы тривиально ответить на ваш вопрос, вы вычисляете расстояние от текущего цвета q к трем целям пи , вы имеете (черный, красный, и белый). Наименьшее расстояние указывает на цвет, которым вы заменяете. В случае связи я держу самый ранний цвет, который дал минимальное расстояние.

Теперь, цветовое пространство также очень важно в этой задаче, так как это устанавливает значение для евклидова расстояния. Вот типовое изображение:

enter image description here

Преобразованный в RGB:

enter image description here

Преобразованный в HLS (т.е., цвет RGB преобразовывается в HLS и расстояние, вычисляется):

enter image description here

HSV:

enter image description here

CIELAB:

enter image description here

5
добавлено
Ха. Теперь я хочу пойти, пробуют мой код и видят то, что он делает>.>
добавлено автор Rawling, источник
Достаточно ярмарка... как красная является обычно нулевым оттенком есть некоторые very-slightly-purply красные, которые, вероятно, установлены в черный или белый, тогда.
добавлено автор Rawling, источник
Мой код дает результат больше всего как ваш HSV, я думаю. NB на вашей оси "оттенка", вы не забываете обертывать его вокруг?
добавлено автор Rawling, источник
Да, конечно. В этом случае вы используете определенное расстояние для определенной цветовой системы, которая прекрасна (и мог привести к лучшим результатам). Для CIELAB самая простая функция Delta E - евклидово расстояние, так, чтобы могла быть другая причина того, почему я нахожу результаты лучше в этом цветовом пространстве (матчи функции расстояния, на что цветовое пространство указывает как расстояние). Проблема - это I' m не знающий о любом глобально принятом расстоянии функционирует для других цветовых систем.
добавлено автор mmgp, источник
@Rawling вы имеете в виду в смысле полагать, что синий оттенок ближе к красному, чем к зеленому оттенку? Я didn' t, это было прямое фиктивное евклидово расстояние между, утраивается, который doesn' t рассматривают особое поведение цветовых пространств.
добавлено автор mmgp, источник
Мне особенно нравятся результаты в CIELAB.
добавлено автор mmgp, источник

Как был указан, самая твердая часть этой проблемы знает, "ближе" ли данный цвет к черному, белому или красному цвету. Я бросил что-то вместе, которое могло бы работать на вас:

Color GetNearestOfBWR(Color c)
{
     float redness = Math.Abs(180 - c.GetHue())/180;
     float brightness = c.GetBrightness();
     float saturation = c.GetSaturation();

You now have three values, each between 0 and 1, where increasing from 0 to 1 means you are getting closer to red (roughly speaking: more red/less green&blue, more color/less black, more color/less grey).

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

     double brightColourfulRedness = Math.Sqrt(
         redness*redness + brightness*brightness + saturation*saturation);
     if (brightColourfulRedness > 1)
         return Color.FromArgb(255, 0, 0);//red;

(простая Евклидова норма), но вы могли бы хотеть нагрузить конкретную собственность более сильно, чем другой - или просто изменить 1 порог.

Тогда необходимо решить что карты черному или белому; это могло быть столь же просто как

    if (brightness > 0.5)
        return Color.FromArgb(255, 255, 255);//white
    return Color.FromArgb(0, 0, 0);//black
}

Большой! Таким образом, теперь у вас есть функция, чтобы нанести на карту цвет к красному, белому или черному цвету, согласно вкусу. Все, что остается, должно применить его к каждому пикселю в вашем битовом массиве. Если вы - счастливое переписывание Битовый массив , вы загрузили от своего файла, вам не нужно множество; можно просто сделать:

int height = imageoriginal.Height;
int width = imageoriginal.Width;
for (int i = 0; i < width; i++)
{
    for (int j = 0; j < height; j++)
    {
        Color origC = imageoriginal.GetPixel(i, j);
        Color newC = GetNearestOfBWR(origC);
        imageoriginal.SetPixel(i, j, newC);
    }
}

Это может быть довольно медленно, таким образом, вы могли альтернативно использовать DmitryG LockBits код, но необходимо будет преобразовать между интервал s, это дает вам и Цвет s требуемый GetNearestOfBWR . ( FromArgb и , ToArgb делают это, я верю.)

1
добавлено

Как был указан, самая твердая часть этой проблемы знает, "ближе" ли данный цвет к черному, белому или красному цвету. Я бросил что-то вместе, которое могло бы работать на вас:

Color GetNearestOfBWR(Color c)
{
     float redness = Math.Abs(180 - c.GetHue())/180;
     float brightness = c.GetBrightness();
     float saturation = c.GetSaturation();

You now have three values, each between 0 and 1, where increasing from 0 to 1 means you are getting closer to red (roughly speaking: more red/less green&blue, more color/less black, more color/less grey).

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

     double brightColourfulRedness = Math.Sqrt(
         redness*redness + brightness*brightness + saturation*saturation);
     if (brightColourfulRedness > 1)
         return Color.FromArgb(255, 0, 0);//red;

(простая Евклидова норма), но вы могли бы хотеть нагрузить конкретную собственность более сильно, чем другой - или просто изменить 1 порог.

Тогда необходимо решить что карты черному или белому; это могло быть столь же просто как

    if (brightness > 0.5)
        return Color.FromArgb(255, 255, 255);//white
    return Color.FromArgb(0, 0, 0);//black
}

Большой! Таким образом, теперь у вас есть функция, чтобы нанести на карту цвет к красному, белому или черному цвету, согласно вкусу. Все, что остается, должно применить его к каждому пикселю в вашем битовом массиве. Если вы - счастливое переписывание Битовый массив , вы загрузили от своего файла, вам не нужно множество; можно просто сделать:

int height = imageoriginal.Height;
int width = imageoriginal.Width;
for (int i = 0; i < width; i++)
{
    for (int j = 0; j < height; j++)
    {
        Color origC = imageoriginal.GetPixel(i, j);
        Color newC = GetNearestOfBWR(origC);
        imageoriginal.SetPixel(i, j, newC);
    }
}

Это может быть довольно медленно, таким образом, вы могли альтернативно использовать DmitryG LockBits код, но необходимо будет преобразовать между интервал s, это дает вам и Цвет s требуемый GetNearestOfBWR . ( FromArgb и , ToArgb делают это, я верю.)

1
добавлено

Как был указан, самая твердая часть этой проблемы знает, "ближе" ли данный цвет к черному, белому или красному цвету. Я бросил что-то вместе, которое могло бы работать на вас:

Color GetNearestOfBWR(Color c)
{
     float redness = Math.Abs(180 - c.GetHue())/180;
     float brightness = c.GetBrightness();
     float saturation = c.GetSaturation();

You now have three values, each between 0 and 1, where increasing from 0 to 1 means you are getting closer to red (roughly speaking: more red/less green&blue, more color/less black, more color/less grey).

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

     double brightColourfulRedness = Math.Sqrt(
         redness*redness + brightness*brightness + saturation*saturation);
     if (brightColourfulRedness > 1)
         return Color.FromArgb(255, 0, 0);//red;

(простая Евклидова норма), но вы могли бы хотеть нагрузить конкретную собственность более сильно, чем другой - или просто изменить 1 порог.

Тогда необходимо решить что карты черному или белому; это могло быть столь же просто как

    if (brightness > 0.5)
        return Color.FromArgb(255, 255, 255);//white
    return Color.FromArgb(0, 0, 0);//black
}

Большой! Таким образом, теперь у вас есть функция, чтобы нанести на карту цвет к красному, белому или черному цвету, согласно вкусу. Все, что остается, должно применить его к каждому пикселю в вашем битовом массиве. Если вы - счастливое переписывание Битовый массив , вы загрузили от своего файла, вам не нужно множество; можно просто сделать:

int height = imageoriginal.Height;
int width = imageoriginal.Width;
for (int i = 0; i < width; i++)
{
    for (int j = 0; j < height; j++)
    {
        Color origC = imageoriginal.GetPixel(i, j);
        Color newC = GetNearestOfBWR(origC);
        imageoriginal.SetPixel(i, j, newC);
    }
}

Это может быть довольно медленно, таким образом, вы могли альтернативно использовать DmitryG LockBits код, но необходимо будет преобразовать между интервал s, это дает вам и Цвет s требуемый GetNearestOfBWR . ( FromArgb и , ToArgb делают это, я верю.)

1
добавлено
Верстка сайтов HTML/CSS/JS/PHP
Верстка сайтов HTML/CSS/JS/PHP
3 439 участник(ов)

Правила группы: напишите !rules в чате. Группа Вк: vk.com/web_structure Freelancer: @web_fl Веб Дизайн: @dev_design Маркетолог: @topmarkening Автор: @M_Boroda

Microsoft Stack Jobs
Microsoft Stack Jobs
1 788 участник(ов)

Work & freelance only Microsoft Stack. Feed https://t.me/Microsoftstackjobsfeed Чат про F#: @Fsharp_chat Чат про C#: @CSharpChat Чат про Xamarin: @xamarin_russia Чат общения:@dotnettalks

CSS — русскоговорящее сообщество
CSS — русскоговорящее сообщество
1 502 участник(ов)

Сообщество любителей CSS Возникли проблемы с CSS? – пиши сюда, обсудим и предложим самое лучшее решение Работа: @css_ru_jobs Правила: https://teletype.in/@css_ru/r1EWtQ2w7 Приходите в наши чаты @javascript_ru и @frontend_ru Флуд: @css_flood

Чат — Типичный Верстальщик
Чат — Типичный Верстальщик
1 080 участник(ов)

Основной канал: @tpverstak Обратная связь: @annblok Все ссылки на соц.сети проекта: http://taplink.cc/tpverstak ПРАВИЛА ЧАТА — https://teletype.in/@annblok/BygPgC3E7

Microsoft Developer Community Chat
Microsoft Developer Community Chat
584 участник(ов)

Чат для разработчиков и системных администраторов Microsoft Developer Community. __________ Новостной канал: @msdevru __________ Баним за: оскорбления, мат, рекламу, флуд, флейм, спам, NSFW контент, а также большое количество оффтоп тем. @banofbot

Веб-Технологи: UI/UX, Вёрстка, Фронтенд
Веб-Технологи: UI/UX, Вёрстка, Фронтенд
167 участник(ов)

Всё про веб-дизайн и вёрстку. А также: HTML, CSS, флекс и бутстрапы, шаблонизаторы, препроцессоры, методологии, аглифаеры, улучшаторы и обфускаторы. Обсуждаем темы юзабилити, устраиваем А/В тесты лендингов, и проводим аудит.

DTP :: @DTPublish
DTP :: @DTPublish
147 участник(ов)

Обсуждаемые темы: полиграфия, препресс, верстка, дизайн, иллюстрации, скрипты, плагины. Канал - @DTPublishing

css_jobs
css_jobs
26 участник(ов)

Чат для вопросов по css и html: @css_ru Флуд: @css_flood Канал с вакансиями и резюме: @css_jobs_feed

css_флуд
css_флуд
10 участник(ов)