Форум программистов, компьютерный форум CyberForum.ru

преобразование bitmap в YCbCr и обратно - C++

Восстановить пароль Регистрация
Другие темы раздела
C++ Треугольник задан своими вершинами (x1,y1),(x2,y2),(x3,y3). Найти высоты треугольника. http://www.cyberforum.ru/cpp-beginners/thread782647.html
Буду очень признателен, если поможете безрукому... 1. Треугольник задан своими вершинами (x1,y1),(x2,y2),(x3,y3). Найти высоты треугольника. Правила форума
C++ cout в классе Создал класс. Вот фрагмент кода: #include <iostream> #include "stdafx.h" #include "put_O.h" using namespace std; char* mass; http://www.cyberforum.ru/cpp-beginners/thread782627.html
C++ multimap
Я что-то не понимаю в чем проблема! #include <iostream> #include <string> #include <map> using namespace std; int main() { multimap<string,float> coll;
лаб роб C++
дано n-ка дийсних чисел. впорядкувати их в порядку зростання
C++ Конструктор по умолчанию + объявление функции http://www.cyberforum.ru/cpp-beginners/thread782615.html
Сам класс: class Man { public: Man(int lName=30); ~Man(); bool CompareName(const char*) const; int GetBirthYear() const { return birth_year;
C++ Поменять местами столбцы матрицы: столбец, содержащий максимальный элемент матрицы, и столбец, содержащий минимальный элемент матрицы. В матрице, состоящей из положительных действительных чисел поменять местами два столбца: столбец, содержащий максимальный элемент матрицы, и столбец, содержащий минимальный элемент матрицы. нужно написать программу ... двумерные массивы изучаем) Правила форума оригинал задания: подробнее

Показать сообщение отдельно
Ermak_nk
6 / 6 / 0
Регистрация: 11.08.2012
Сообщений: 108
09.02.2013, 17:17     преобразование bitmap в YCbCr и обратно
Доброго времени суток. Нужно преобразовать изображение из формата RGB в YCbCr и обратно.
В принципе все работает, но после преобразования цвета искажены. Коэффициенты проверил не один раз - все правильно, кто может подсказать в чем косяк?
(изображение прилагаются, изменен размер, преобразовано в jpg)
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
unsigned char* RGBToYCbCr(BITMAPINFOHEADER* bh, unsigned char* lpSurface)
{
    __int16 Y, Cb, Cr;
    int imgData;
    char lnPixel;
    unsigned char r,g,b;
    unsigned char* lpSurface2;
 
    lpSurface2 = new unsigned char[bh->biHeight * bh->biWidth * (bh->biBitCount/8)];
    lnPixel = bh->biBitCount/8;
 
 
    for(int i = 0; i < bh->biHeight/8; i++)//блоки по вертикале
    {
        for(int j = 0; j < bh->biWidth/8; j++)//блоки по горизонтале
        {
            imgData = ((i*8)*bh->biWidth + j*8)*lnPixel; //начальная координата блока
            for(int k = 0; k < 8; k++)//пиксели по вертикале
            {
                for(int l = 0; l < 8; l++)//пиксели по горизонтале
                {
                    r = lpSurface[imgData + k*bh->biWidth*lnPixel + l*lnPixel];
                    g = lpSurface[imgData + k*bh->biWidth*lnPixel + l*lnPixel + 1];
                    b = lpSurface[imgData + k*bh->biWidth*lnPixel + l*lnPixel + 2];
 
                    Y = 0.299*r + 0.587*g + 0.114*b;
                    Cb = 128 - 0.168736*r - 0.331264*g + 0.5*b;
                    Cr = 128 + 0.5*r - 0.418688*g + 0.081312*b;
 
                    if(Y>255) Y=255;
                    else if(Y<0) Y=0;
                    if(Cb>255) Cb=255;
                    else if(Cb<0) Cb=0;
                    if(Cr>255) Cr=255;
                    else if(Cr<0) Cr=0;
 
                    lpSurface2[imgData + k*bh->biWidth*lnPixel + l*lnPixel] = Y;
                    lpSurface2[imgData + k*bh->biWidth*lnPixel + l*lnPixel + 1] = Cb;
                    lpSurface2[imgData + k*bh->biWidth*lnPixel + l*lnPixel + 2] = Cr;
 
                }
            }
        }
    }
 
    delete[] lpSurface;
 
    return lpSurface2;
}
 
 
unsigned char* YCbCrToRGB(BITMAPINFOHEADER* bh, unsigned char* lpSurface)
{
    unsigned char Y, Cb, Cr;
    int imgData;
    char lnPixel;
    __int16 r,g,b;
    unsigned char* lpSurface2;
 
    lpSurface2 = new unsigned char[bh->biHeight * bh->biWidth * (bh->biBitCount/8)];
    lnPixel = bh->biBitCount/8;
 
 
    for(int i = 0; i < bh->biHeight/8; i++)//блоки по вертикале
    {
        for(int j = 0; j < bh->biWidth/8; j++)//блоки по горизонтале
        {
            imgData = ((i*8)*bh->biWidth + j*8)*lnPixel; //накальная координата блока
            for(int k = 0; k < 8; k++)//пиксели по вертикале
            {
                for(int l = 0; l < 8; l++)//пиксели по горизонтале
                {
                    Y = lpSurface[imgData + k*bh->biWidth*lnPixel + l*lnPixel];
                    Cb = lpSurface[imgData + k*bh->biWidth*lnPixel + l*lnPixel + 1];
                    Cr = lpSurface[imgData + k*bh->biWidth*lnPixel + l*lnPixel + 2];
 
                    r = Y + 1.402*(Cr-128);
                    g = Y - 0.34414*(Cb - 128) - 0.71414*(Cr - 128);
                    b = Y + 1.772*(Cb - 128);
 
                    if(r>255) r=255;
                    else if(r<0) r=0;
                    if(g>255) g=255;
                    else if(g<0) g=0;
                    if(b>255) b=255;
                    else if(b<0) b=0;
 
                    lpSurface2[imgData + k*bh->biWidth*lnPixel + l*lnPixel] = r;
                    lpSurface2[imgData + k*bh->biWidth*lnPixel + l*lnPixel + 1] = g;
                    lpSurface2[imgData + k*bh->biWidth*lnPixel + l*lnPixel + 2] = b;
 
                }
            }
        }
    }
 
    delete[] lpSurface;
    return lpSurface2;
}

Заранее спасибо
Миниатюры
преобразование bitmap в YCbCr и обратно   преобразование bitmap в YCbCr и обратно  
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
 
Текущее время: 01:51. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru