Mail.ruПочтаМой МирОдноклассникиВКонтактеИгрыЗнакомстваНовостиКалендарьОблакоЗаметкиВсе проекты

С# Разработайте и реализуйте собственный алгоритм, переводящий изображение в градациях серого цвета в цвет.

Богдан Сабодаш Ученик (167), закрыт 12 месяцев назад
Градация задаётся кодом ниже.
 // Циклы для перебора всех пикселей на изображении  
for (int i = 0; i < bmp.Width; i++)
for (int j = 0; j < bmp.Height; j++)
{
// Извлекаем в R значение красного цвета
int R = bmp.GetPixel(i, j).R;
// Извлекаем в G значение зеленого цвета
int G = bmp.GetPixel(i, j).G;
// Извлекаем в B значение синего цвета
int B = bmp.GetPixel(i, j).B;
// Высчитываем среднее арифметическое
int Gray = (R + G + B) / 3;
// Переводим число в значение цвета.
// 255 – показывает степень прозрачности.
// Остальные значения одинаковы
Color p = Color.FromArgb(255, Gray, Gray,
Gray);
// Записываем цвет в текущую точку
bmp.SetPixel(i, j, p);
}
// Вызываем функцию перерисовки окна
Refresh();
Лучший ответ
Алекс Куха Высший разум (446501) 1 год назад
Практически надо поставить соответствие [0..255] уровни серого индексу выбранной палитры в 3х каналах. В сети есть генератор палитр, н-р здесь
Остальные ответы
InviZzzible Мудрец (10825) 1 год назад
И что тебе не нравится? Открывающихся кобок нет у первого цикла и закрывающихся скобок нет у этого же цикла перед обновлением...
Богдан СабодашУченик (167) 1 год назад
Этот алгоритм переводит фото в серые оттенки, а надо из серых получить цветное
InviZzzible Мудрец (10825) Богдан Сабодаш, и как ты хочешь это сделать. Это только нейросети недавно научились это делать.. Если не важно в какие цвета то просто можешь ставить рандомнве значения цветов. Главное чтоб r, g и b были разными по значению ну и конечно в пределах от 0 до 255 )))
Александр Просветленный (20700) 1 год назад
Вашим текущим алгоритмом это точно нельзя сделать.
int Gray = (R + G + B) / 3; - тут вы получите оттенок серго цвета
Color p = Color.FromArgb(255, Gray, Gray, Gray); - а тут вы заполняете RGB модель одним значением.
Как вы потом вернете это обратно? Как это можно высчитать вообще, учитывая что значение Gray может быть получено из различных комбинаций.
Богдан СабодашУченик (167) 1 год назад
Скажу преподавателю, что видимо никак не получится это сделать. Просто странно, что вообще задают такое, если это невозможно...
Богдан Сабодаш, можно перевести из одного монохрома в другой. Например, всё значение серой шкалы - в красное, а остальные цвета - по нулям. Будет такой этюд в багровых тонах. Или можно пропорционально нарастить синий и зелёный, чтоб не так мрачно смотрелось. Например, на 25% от значения серого. Восстановить исходное изображение невозможно, оно было преобразовано с потерей информации.
Dmitrii DNK Мастер (1243) 1 год назад
Чтобы перевести изображение из оттенков серого в цвет, можно создать цветовую палитру на основе значения оттенков серого для каждого пикселя изображения. Значение шкалы серого можно рассчитать как среднее значение красного, зеленого и синего цветов для каждого пикселя. Затем каждое значение шкалы серого можно сопоставить с соответствующим цветом в цветовой палитре.

Вот реализация алгоритма на языке C# с использованием предоставленного кода:
 private void TranslateToColor(Bitmap bmp) 
{
for (int i = 0; i < bmp.Width; i++)
{
for (int j = 0; j < bmp.Height; j++)
{
int R = bmp.GetPixel(i, j).R;
int G = bmp.GetPixel(i, j).G;
int B = bmp.GetPixel(i, j).B;
int gray = (R + G + B) / 3;

// Create the color palette based on the grayscale value
Color color;
if (gray >= 0 && gray < 85)
color = Color.FromArgb(255, 0, 0, gray * 3);
else if (gray >= 85 && gray < 170)
color = Color.FromArgb(255, 0, (gray - 85) * 3, 255);
else
color = Color.FromArgb(255, (gray - 170) * 3, 255, 255);

bmp.SetPixel(i, j, color);
}
}

Refresh();
}
Этот алгоритм отображает значения серого цвета в цветовую палитру, которая варьируется от красного до зеленого и синего. Вы можете настроить цветовую палитру по своему усмотрению, чтобы добиться желаемого эффекта.
Dmitrii DNKМастер (1243) 1 год назад
Вот еще один вариант перевода изображения из полутонов в цвет:
 private void TranslateToColor(Bitmap bmp) 
{
for (int i = 0; i < bmp.Width; i++)
{
for (int j = 0; j < bmp.Height; j++)
{
int R = bmp.GetPixel(i, j).R;
int G = bmp.GetPixel(i, j).G;
int B = bmp.GetPixel(i, j).B;
int gray = (R + G + B) / 3;

// Create the color palette based on the grayscale value
Color color = Color.FromArgb(255, gray, gray * 2, 255 - gray);

bmp.SetPixel(i, j, color);
}
}

Refresh();
}
Точные цвета будут зависеть от значений, присвоенных красным, зеленым и синим компонентам каждого пикселя.
Dmitrii DNKМастер (1243) 1 год назад
 Вариант 1: Значения шкалы серого в цветовую палитру, которая варьируется от красного до зеленого и синего. Этот вариант может быть лучшим, если вы хотите подчеркнуть яркие и темные области изображения и создать высококонтрастный эффект. 

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

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