Extremesarova
@Extremesarova
Биоинформатика, машинное обучение, анализ данных.

Как переконвертировать изображение из RGB в YIQ, используя c#?

Я пытался конвертировать. Вот мой код:
private void RGBtoYIQbutton_Click(object sender, EventArgs e)
        {
            int[] vector_yiq = new int[3];
            double r, g, b, y, i, q;

            Bitmap bmp = new Bitmap(pictureBox1.Image);

            for (int x = 0; x < bmp.Width; x++)
            {
                for (int y = 0; y < bmp.Height; y++)
                {
                    Color clr = bmp.GetPixel(x, y);
                    r = (double)clr.R / 255;
                    g = (double)clr.G / 255;
                    b = (double)clr.B / 255;

                    y = Convert.ToInt32((0.299 * r + 0.587 * g + 0.114 * b) * 100);
                    i = Convert.ToInt32((0.596 * r - 0.274 * g - 0.322 * b) * 100);
                    if (i < 0)
                        i = Convert.ToInt32((0.596 * r - 0.274 * g - 0.322 * b + 0.5957) * 100);
                    q = Convert.ToInt32((0.211 * r - 0.522 * g + 0.311 * b ) * 100);
                    if (q < 0)
                        q = Convert.ToInt32((0.211 * r - 0.522 * g + 0.311 * b + 0.5226) * 100);

                    Color pixelColor;
                    pixelColor = Color.FromArgb(y, i, q);
                    bmp.SetPixel(x, y, pixelColor);
                }
            }
            pictureBox1.Image = bmp;
}

Я знаю, что параметр Y имеет диапазон [0,1], параметр I имеет диапазон [-0.523,0.523], а параметр Q имеет диапазон [-0.596,0.596]. Также я знаю, что R, G и B имеют диапазон [0,255].
Нужно как-нибудь привести диапазоны или я чего-нибудь не понимаю. Я использую "if", чтобы получить положительные значения для G и B. Из-за этого я получаю неправильное изображение. Как я могу сделать этот перевод?
И вообще можно ли как-нибудь по другому задавать цвет пикселя?
  • Вопрос задан
  • 3171 просмотр
Решения вопроса 1
Fesor
@Fesor
Full-stack developer (Symfony, Angular)
pixelColor = Color.FromArgb(y, i, q);
как вам верно земетили на stackoverfow, использовать этот метод нужно только для RGB/RGBA. Работать же напрямую с yiq .NET не умеет. Обычно нестандартные цветовые пространства используют для промежуточных преобразований.

к слову параметр i имеет диапозон [-0.522, 0.522] а i [-0.596, 0.596].

По ходу же алгоритма вам эти if-ы тоже не нужны, за вас все делают коэфициенты. Для примера:

i = 0.596 * r - 0.274 * g - 0.322 * b;
i = 0.596 * 0 - 0.274 * 1 - 0.322 * 1;
i = -0.596

следовательно не нужно вам никаких этих извращений с if-ами.
p.s. а на 100 вы зачем умножаете? Пытаетесь таким образом подогнать значения что бы FromArgb их кушало? Этого делать не нужно.

И вообще можно ли как-нибудь по другому задавать цвет пикселя?

А толку если от смены цветового пространсва у вас цвет не поменяется...
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы