Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.81/48: Рейтинг темы: голосов - 48, средняя оценка - 4.81
0 / 0 / 0
Регистрация: 09.03.2013
Сообщений: 7

Преобразование цветового пространства RGB в YCbCr

18.09.2013, 21:00. Показов 9255. Ответов 5
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем здравствуйте.. Совсем недавно мы в универе начали изучать C# и вот такая тема лабораторной работы..
преобразование RGB->YCbCr(Jpeg) .. подскажите пожалуйста каким образом можно реализовать данное преобразование с картинкой?
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
18.09.2013, 21:00
Ответы с готовыми решениями:

Получить Y компоненту цветового пространства ycbcr
Приветствую всех! Подскажите, пожалуйста, можно ли получить только Y компоненту? И если можно то как? Ну, например: 1. Загружаем...

Изменение цветового формата с rgb на cmyk
Здравствуйте, никак не могу преобразовать цветовой формат в картинке (Bitmap), в пробовал подключить graphics mill, но почему то программа...

Матрица цветов преобразование RGB
Привет, нужно преобразовать RGB цвет, например rgb(55, 55, 55) в такую матрицу цветов. var magEffectInvert = new...

5
Администратор
Эксперт .NET
 Аватар для tezaurismosis
9673 / 4825 / 763
Регистрация: 17.04.2012
Сообщений: 9,664
Записей в блоге: 14
18.09.2013, 22:14
Читаем теорию
Вот вам структура для работы с цветовым пространством YCbCr. Перепроверьте коэффициенты, я уже плохо соображаю во втором часу ночи.
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
public struct YCbCrColor
{
    public byte Y { set; get; }
    public byte Cb { set; get; }
    public byte Cr { set; get; }
 
    public YCbCrColor(byte y, byte cb, byte cr) : this() {
        Y = y;
        Cb = cb;
        Cr = cr;
    }
 
    public Color ToRgbColor() {
        int r = Convert.ToInt32((double)this.Y + 
            1.402 * (double)(this.Cr - 128));
        int g = Convert.ToInt32((double)this.Y - 
            0.34414 * (double)(this.Cb - 128) - 
            0.71414 * (double)(this.Cr - 128));
        int b = Convert.ToInt32((double)this.Y +
            1.772 * (double)(this.Cb - 128));
 
        return Color.FromArgb(r, g, b);
    }
 
    public static YCbCrColor FromRgbColor(Color color) {
        byte y = Convert.ToByte(0.299 * (double)color.R +
            0.587 * (double)color.G +
            0.114 * (double)color.B);
        byte cb = Convert.ToByte(128 - 0.168736 * (double)color.R +
            0.331264 * (double)color.G +
            0.5 * (double)color.B);
        byte cr = Convert.ToByte(128 + 0.5 * (double)color.R -
            0.418688 * (double)color.G -
            0.081312 * (double)color.B);
 
        return new YCbCrColor(y, cb, cr);
    }
}
2
0 / 0 / 0
Регистрация: 09.03.2013
Сообщений: 7
19.09.2013, 01:00  [ТС]
Спасибо большое ,

Добавлено через 2 часа 21 минуту
а можешь подсказать.. а как передать переменные от картинки ?заранее спасибо
0
Администратор
Эксперт .NET
 Аватар для tezaurismosis
9673 / 4825 / 763
Регистрация: 17.04.2012
Сообщений: 9,664
Записей в блоге: 14
19.09.2013, 15:10
C#
1
2
3
4
5
// Bitmap можете создать из файла или из источника у Graphics, если используете PictureBox
using (Bitmap bmp = new Bitmap(img))
{
    Color clr = bmp.GetPixel(5, 5); // Получить цвет пикселя в точке (5, 5)
}
Так как вам придётся обрабатывать все пиксели, то такой подход может оказаться недостаточно быстрым, тогда воспользуйтесь LockBits
1
0 / 0 / 0
Регистрация: 26.10.2015
Сообщений: 3
08.12.2015, 15:21
Используя данную структуру в своей программе возникает ошибка на строке
byte y = Convert.ToByte(0.299 * (double)color.R - 0.587 * (double)color.G + 0.114 * (double)color.B); :Значение было недопустимо малым или недопустимо большим для без знакового байта. Как ее исправить?
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Drawing;
using System.Drawing.Imaging;
using System.Runtime.InteropServices;
 
namespace ImageProcessingLibrary
{
    public class NegativeHandlerFast:IImageHandler
    {
        private const string HANDLER_NAME = "Negative fast handler";
 
        private Bitmap bitmap;
 
 
        public string HandlerName 
        {
            get { return HANDLER_NAME; }            
        }
 
 
        public void init(SortedList<string, object> parameters)
        {
            
        }
 
        
        public Bitmap Source 
        {
            set { bitmap = value; } 
        }
 
        
        public Bitmap Result 
        {
            get { return bitmap; }
        }
        public struct YCbCrColor
        {
            public byte Y { set; get; }
            public byte Cb { set; get; }
            public byte Cr { set; get; }
 
            public YCbCrColor(byte y, byte cb, byte cr)
                : this()
            {  if (y < 0) y = 0;
                else if (Y > 255) y = 255;
                Y = y;
                Cb = cb;
                Cr = cr;
                               
            }
 
            public Color ToRgbColor()
            {
                int r = Convert.ToInt32((double)this.Y +
                    1.402 * (double)(this.Cr - 128));
                int g = Convert.ToInt32((double)this.Y -
                    0.34414 * (double)(this.Cb - 128) -
                    0.71414 * (double)(this.Cr - 128));
                int b = Convert.ToInt32((double)this.Y +
                    1.772 * (double)(this.Cb - 128));
                if (g < 0) g = 0;
                else if (g > 255) g=255;
                 return Color.FromArgb(r, g, b);
            }
 
            public YCbCrColor FromRgbColor(Color color)
            {
                
                byte y = Convert.ToByte(0.299 * (double)color.R - 0.587 * (double)color.G + 0.114 * (double)color.B); 
                byte cb = Convert.ToByte(128 - 0.168736 * (double)color.R + 0.331264 * (double)color.G + 0.5 * (double)color.B);
                byte cr = Convert.ToByte(128 + 0.5 * (double)color.R - 0.418688 * (double)color.G - 0.081312 * (double)color.B);
                
                
                
                return new YCbCrColor(y, cb, cr);
            }
        }
        //Запуск обработки
        public void startHandle(ProgressDelegate progressDelegate)
        {
 
            Bitmap result = new Bitmap(bitmap.Width, bitmap.Height);
 
            //Rectangle rect = new Rectangle(0, 0, result.Width, result.Height);
 
            //BitmapData bitmapData = result.LockBits(rect, ImageLockMode.ReadWrite, result.PixelFormat);
 
            //IntPtr ptr = bitmapData.Scan0;
 
            //int bytes = bitmapData.Stride * result.Height;
 
            //byte[] rgbValues = new byte[bytes];
            //YCbCrColor conv = new YCbCrColor();
 
            //Marshal.Copy(ptr, rgbValues, 0, bytes);
 
            Color color;
            YCbCrColor conv = new YCbCrColor();
            for (int i = 0; i < result.Height; i++)
            {
 
                for (int j = 0; j < result.Width; j++)
                {
                    color = bitmap.GetPixel(i, j);
                    conv = conv.FromRgbColor(color);
                    result.SetPixel(i, j, conv.ToRgbColor());
                }
                this.bitmap = result;
            }
 
        }
 
 
    }
}
0
Администратор
Эксперт .NET
 Аватар для tezaurismosis
9673 / 4825 / 763
Регистрация: 17.04.2012
Сообщений: 9,664
Записей в блоге: 14
08.12.2015, 17:18
evikspecter, действительно, писать ночью код не есть хорошо.
Как говорится: "Лучше уйти в пятницу домой вовремя и ночью спать, чем весь понедельник отлаживать написанный ночью пятницы код".
Ошибка в одном знаке
C#
1
2
3
byte y = Convert.ToByte(0.299 * (double)color.R +
    0.587 * (double)color.G +
    0.114 * (double)color.B);
Исправил ошибку и в своём предыдущем сообщении.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
08.12.2015, 17:18
Помогаю со студенческими работами здесь

Преобразование изображения из RGB в CMYK
При переводе изображения из RGB в CMYK не получается записать рассчитанные для CMYK значения в bitmap с помощью SetPixel (т.е. создать...

Преобразование из YCbCr в RGB
ЧЯДнТ? Формула? Код? Цветовое пространство? :help: #define BYTE uchar void MainWindow::yuv_rgb(BYTE* array, BYTE Y) { BYTE...

QImage: RGB to YCbCr
Здравствуйте! Стоит следующая задача: необходимо считать изображение в цветовой схеме RGB и перевести его и записать в схеме YCbCr. Раньше...

Преобразование bitmap в YCbCr и обратно
Доброго времени суток. Нужно преобразовать изображение из формата RGB в YCbCr и обратно. В принципе все работает, но после преобразования...

Графика: Получение негатива отдельно для каждого цветового канала RGB изображения.
1) Получение негатива отдельно для каждого цветового канала RGB изображения. 2) Создание на изображении эффекта «стекла» Может кто...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
SDL3 для Web (WebAssembly): Работа со звуком через SDL3_mixer
8Observer8 08.02.2026
Содержание блога Пошагово создадим проект для загрузки звукового файла и воспроизведения звука с помощью библиотеки SDL3_mixer. Звук будет воспроизводиться по клику мышки по холсту на Desktop и по. . .
SDL3 для Web (WebAssembly): Основы отладки веб-приложений на SDL3 по USB и Wi-Fi, запущенных в браузере мобильных устройств
8Observer8 07.02.2026
Содержание блога Браузер Chrome имеет средства для отладки мобильных веб-приложений по USB. В этой пошаговой инструкции ограничимся работой с консолью. Вывод в консоль - это часть процесса. . .
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru