Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.59/34: Рейтинг темы: голосов - 34, средняя оценка - 4.59
48 / 30 / 0
Регистрация: 09.11.2008
Сообщений: 424
1

Разложить картинку на RGB в 3 массива

01.09.2008, 00:15. Показов 6709. Ответов 4
Метки нет (Все метки)

Столкнулся с проблемой, нужно разложить картинку 32x32 вставленную в Image на составные цвета в 3 массива R, G, B соответственно, чтобы потом работать с ними.
Собственно запутался что использовать и как, GetPixel пользоваться не очень умею, и инфы чего-то не найти нормальной по нему. Подскажите как попроще это сделать.
C++
1
2
3
4
5
6
7
8
9
10
int R[32][32];
int G[32][32];
int B[32][32];
for (int y=0; y<32; y++){
        for (int x=0; x<32; x++){
        R[x][y]=?
        G[x][y]=?
        B[x][y]=?
        }
}
__________________
Помощь в написании контрольных, курсовых и дипломных работ здесь
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
01.09.2008, 00:15
Ответы с готовыми решениями:

Нужно разложить код цвета на составляющие Red, Green, Blue (функция, обратная RGB)
Я знаю код цвета в виде переменной типа Long (например, как свойство range(&quot;a1&quot;).interior.color). ...

HTML - Надо: вставить картинку в картинку, в эту картинку, ссылку в картинку
Вот схема моего сайта. http://s020.***********/i716/1404/8c/254516feacb3.jpg У меня пока что на...

Разложить элементы массива по html шаблону
Псевдокод PHP-HTML &lt;div id=&quot;container&quot;&gt; &lt;div class=&quot;item&quot;&gt; &lt;div class=&quot;row&quot;&gt; ...

Разделение массива на два со значениями null + дальнейшая отрисовка этого массива в PNG картинку
Всем доброго времени суток! Делаю задачу на сегментацию изображений в Lab View. Требуется...

4
Эксперт С++
2252 / 767 / 25
Регистрация: 27.05.2008
Сообщений: 1,496
01.09.2008, 07:29 2
процитирую MSDN :
C++
1
2
3
4
5
6
COLORREF GetPixel(
 
    HDC hdc,    // handle of device context  
    int XPos,    // x-coordinate of pixel 
    int nYPos     // y-coordinate of pixel 
   );
The COLORREF value is a 32-bit value used to specify an RGB color.

When specifying an explicit RGB color, the COLORREF value has the following hexadecimal form:
0x00bbggrr
see also :
BYTE GetGValue( DWORD rgb);
Return Values
The return value is the intensity of the green component of the specified RGB color.
.. BYTE GetRValue(DWORD rgb), BYTE GETBValue(DWORD rgb)
0
48 / 30 / 0
Регистрация: 09.11.2008
Сообщений: 424
02.09.2008, 12:02  [ТС] 3
Спасибо.
Написал так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
int Lr[32][32];
int Lg[32][32];
int Lb[32][32];
for (int y=0; y<32; y++){                                          // Считывание с картинки
        for (int x=0; x<32; x++){
        Lr[x][y]=GetRValue(GetPixel(Image18, x, y));
        Lg[x][y]=GetGValue(GetPixel(Image18, x, y));
        Lb[x][y]=GetBValue(GetPixel(Image18, x, y));
        }
}
for (int y=0; y<32; y++){                                           // Рисование увеличенной копии
        for (int x=0; x<32; x++){
        int red = Lr[x][y];
        int blue = Lg[x][y];
        int green = Lb[x][y];
        Image17->Canvas->Brush->Color = (TColor)RGB(red,green,blue);
        Image17->Canvas->FillRect(Rect(x*8,y*8,8*x+8,8*y+8));
                }
        }
Так вот получается белый квадрат, подозреваю что что-то надо написать вместо Image 18 в строке Lr[x][y]=GetRValue(GetPixel(Image18, x, y)); а что? или как указать что считывать картинку с Image18?
0
48 / 30 / 0
Регистрация: 09.11.2008
Сообщений: 424
02.09.2008, 12:29  [ТС] 4
C++
1
Lr[x][y]=GetRValue(GetPixel(Image18->Picture->Bitmap->Canvas->Handle, x, y));
все, понял, надо было так))
0
48 / 30 / 0
Регистрация: 09.11.2008
Сообщений: 424
06.09.2008, 21:28  [ТС] 5
Столкнулся с новой проблемой.Пишу программку, которая будет показывать разницу между кодированием в Jpeg блоками 8х8 и

32х32, при этом реализую алгоритм до стадии сжатия по хаффману, то есть после квантования

начинаю обратное восстановление, так вот восстановленная матрица не соответствует правильной,

элементы остаются сконцентрированными в левом верхнем углу. Вот код для одной матрицы 32х32:
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
//---Получаю цвета с картинки-образца и перевожу их в YCbCr
int Lr[32][32]; int Lg[32][32]; int Lb[32][32];
int Ly[32][32]; int Lcb[32][32]; int Lcr[32][32];
for (int y=0; y<32; y++){
        for (int x=0; x<32; x++){
        Lr[x][y]=GetRValue(GetPixel(Image18->Picture->Bitmap->Canvas->Handle, x, y));
        Lg[x][y]=GetGValue(GetPixel(Image18->Picture->Bitmap->Canvas->Handle, x, y));
        Lb[x][y]=GetBValue(GetPixel(Image18->Picture->Bitmap->Canvas->Handle, x, y));
        int R=Lr[x][y];int G=Lg[x][y]; int B=Lb[x][y];
        Ly[x][y] = 0.299*R + 0.578*G + 0.114*B;
        Lcb[x][y] = -0.1678*R - 0.3313*G + 0.5*B+128;
        Lcr[x][y] = 0.5*R - 0.4187*G + 0.0813*B+128;
        }
}
//-------------------------Создаю DCT и DCTT
float LDCT[32][32]; float LDCTT[32][32];
int n = 32;
float n2 = 0.25;      //----корень из 2/32
for (int j=0; j<32; j++){
        for (int i=0; i<32; i++){
        if (i==0) LDCT[i][j]=1/sqrt(n);
        if (i>0) LDCT[i][j]=n2*cos((2*j+1)*i*3.14)/(2*n);
        LDCTT[j][i]=LDCT[i][j];
        }
}
//------------------------Умножаю Lcb на DCTT и результат на DCT
int Ltmpcb[32][32]; int LREScb[32][32];
for(int i = 0; i < 32; i++)
        for(int j = 0; j < 32; j++)
        {
            Ltmpcb[i][j] = 0;
            for(int k = 0; k < 32; k++)
                Ltmpcb[i][j] += (Lcb[i][k]*LDCTT[k][j]);
        }
for(int i = 0; i < 32; i++)
        for(int j = 0; j < 32; j++)
        {
            LREScb[i][j] = 0;
             for(int k = 0; k < 32; k++)
                LREScb[i][j] += (Ltmpcb[i][k] * LDCT[k][j]);
        }
//--------------Квантование, создаем матрицу Q и делим на ее значения матрицу REScb
int q=StrToInt(LabeledEdit1->Text);  //------коэфф. квантования
int LQ[32][32];
int LAcb[32][32];
for(int i=0;i<32;i++)
{
   for(int j=0;j<32;j++){
        LQ[i][j] = 1+((1+i+j)*q);
        }
}
 
for(int i=0;i<32;i++)
{
   for(int j=0;j<32;j++){
        LAcb[i][j] = LREScb[i][j] / LQ[i][j];
        }
}
//-------Все, сжатие делать не требуется, теперь восстанавливаем
//-----------------Умножаем на элементы матрицы квантования
int RLREScb[32][32];
 
for(int i=0;i<32;i++){
   for(int j=0;j<32;j++)
        RLREScb[i][j] =LAcb[i][j] * LQ[i][j];
}
//-----------------Умножаем на матрицу DCT
int RLtmpcb[32][32];
for(int i = 0; i < 32; i++){
        for(int j = 0; j < 32; j++){
            RLtmpcb[i][j] = 0;
            for(int k = 0; k < 32; k++)
                RLtmpcb[i][j] += (RLREScb[i][k] * LDCT[k][j]);
        }
}
//-----------------Умножаем на матрицу DCTT
int RLcb[32][32];
 
for(int i = 0; i < 32; i++){
        for(int j = 0; j < 32; j++){
            RLcb[i][j] = 0;
            for(int k = 0; k < 32; k++)
                RLcb[i][j] += (RLtmpcb[i][k] * LDCTT[k][j]);
     }
}
//----------------Переводим цвета в RGB
int RLr[32][32];
int RLg[32][32];
int RLb[32][32];
for (int y=0; y<32; y++){
        for (int x=0; x<32; x++){
        int cy=Ly[x][y];
        int cb=RLcb[x][y]-128;
        int cr=RLcr[x][y]-128;
        RLr[x][y] = cy+(1.4075*cr);
        RLg[x][y] = cy-(0.3455*cb)-(0.7169*cr);
        RLb[x][y] = cy+(1.7790*cb);
        }
}
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
06.09.2008, 21:28

Гистограмма CMYK/RGB - некорректный перевод из CMYK в RGB
Возникла проблема с правильностью перевода из RGB в CMYK. Все переменные до самого конца - double,...

Разложить число на возможные варианты суммы чисел массива
Условие задачи: дан одномерный массив длины N и число L. Найти все возможные различные разложения...

Следующие формулы разложить по переменной x1, разложить по переменной x2, преобразовать к СДНФ
Следующие формулы 1) разложить по переменной x1, 2) разложить по переменной x2, 3) преобразовать к...

Вытаскиваем картинку из массива
Суть такая: есть массив картинок &quot;shamass&quot; (в примере будет всего 2), имедж &quot;shapka&quot;, в который...

Вывести картинку из массива
Вопрос такой не могу понять как вывести картинку?)) &lt;script type=&quot;text/javascript&quot;&gt; slide = new...

Восстановить картинку из массива байтов
Здравствуйте. Необходимо считать массив байтов из базы данных, восстановить из массива картинку и...


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

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.