Фото в оттенках серого в C # .NET и Windows Forms - PullRequest
0 голосов
/ 22 января 2012

Как превратить это в оттенки серого?

После долгих поисков, мне кажется, что лучшее, что я могу сделать, это изменить оттенок изображения (в коде ниже это зеленый оттенок). Как я могу это сделать?

byte[] redGreenBlueVal = new byte[numBytes];

for (int i = 0; i < redGreenBlueVal .Length; i += 4)
{
    redGreenBlueVal [i + 0] = (byte)(.114 * redGreenBlueVal [i + 0]); --> blue
    redGreenBlueVal [i + 1] = (byte)(.587 * redGreenBlueVal [i + 1]); --> green
    redGreenBlueVal [i + 2] = (byte)(.299 * redGreenBlueVal [i + 2]); --> red
}

Ответы [ 3 ]

3 голосов
/ 22 января 2012

Фактически вы настраиваете HSB, так что вы получите лучшее изображение в оттенках серого: 30% КРАСНЫЙ 59% ЗЕЛЕНЫЙ 11% СИНИЙ

byte[] redGreenBlueVal = new byte[numBytes];

for (int i = 0; i < redGreenBlueVal .Length; i += 4)
{
      gray = (byte)(.11 * redGreenBlueVal [i + 0]);
      gray += (byte)(.59 * redGreenBlueVal [i + 1]); 
      gray += (byte)(.3 * redGreenBlueVal [i + 2]);

      redGreenBlueVal [i + 0] = gray;
      redGreenBlueVal [i + 1] = gray;
      redGreenBlueVal [i + 2] = gray;

}
1 голос
/ 22 января 2012

Можно попробовать установить для каждого пикселя цветовые каналы на среднее значение для этого пикселя.

, т. Е.

for( int i = 0; i < redGreenBlueVal.Length; += 4 )
{
    int average = (redGreenBlueVal[i + 0] + redGreenBlueVal[i + 1] + redGreenBlueVal[i + 2])/3;
    redGreenBlueVal[i + 0] = average;
    redGreenBlueVal[i + 1] = average;
    redGreenBlueVal[i + 2] = average;
}
0 голосов
/ 22 января 2012

Чтобы получить изображение в градациях серого, основная идея состоит в том, чтобы все 3 канала имели одинаковое значение.Есть много способов сделать это, самые простые из них:

  • использовать только один из каналов (это будет выглядеть при выборе отдельных каналов в фотошопе)
  • вычисление среднегоиз 3 каналов
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...