2013-07-03 5 views
4

Я кодирую видеокодек с использованием технологии сжатия JPEG для каждого кадра. До сих пор я уже кодировал YUV, DCT и квантовал DCT (кодирование и декодирование). Я уже кодировал кодировку YUV422, но я не понимаю, как сделать обратное (декодирование).Как преобразовать YUV422 (под выборка) в YUV?

Чтобы вычислить мой YUV для каждого пикселя я использовал следующие уравнения:

Кодирование:

Y = 0.299 * R + 0.587 * G + 0.114 * B 
U = -0.1687 * R - 0.4187 * G + 0.5 * B + 128 
V = 0.5 * R - 0.4187 * G - 0.0813 * B + 128 

Декодирования:

R = Y + 1.402 * (V - 128) 
G = Y - 0.34414 * (U - 128) - 0.71414 * (V - 128) 
B = Y + 1.772 * (U - 128) 

Это уравнение сделать идеальную работу.

Теперь, чтобы выполнить кодировку с суб-выборкой, я беру свое изображение, закодированное в YUV, и я вычисляю сумму из двух смежных пикселей, и я делю результат на 2. Результат задается для 2 пикселей.

Пример:

Для простоты я буду принимать значение пикселя в диапазоне от 0 до 255 (без использования компонентов RGB).

Только что: 2 примера с тем же результатом.

Pixel_1 = 15, Pixel_2 = 5 -> (Pixel_1 + Pixel_2)/2 = 10 

Pixel_3 = 10, Pixel_4 = 10 -> (Pixel_3 + Pixel_4)/2 = 10 

Если я применить это уравнение для всех пикселей моего YUV изображения, я получаю новый образ, но на этот раз закодирован в YUV422 подвыборке.

Мне интересно, как я могу вернуть изображение YUV из изображения YUV422. Мой пример чуть выше показывает, что вернуть исходное изображение YUV невозможно, потому что есть много комбинаций, которые приводят к такому же результату (здесь 10). Тем не менее, я думаю, что есть способ получить, дать или взять несколько, те же оригинальные значения пикселей YUV. Кто-нибудь может мне помочь, пожалуйста? Я действительно потерян. Большое спасибо за вашу помощь.

ответ

8

Это, как пиксели расположены в 4: 2: 0 и 4: 2: 2 (обычно)

420

422

Это правильный способ интерполяции цветности между 4 : 2: 2 и 4: 2: 0 (яркостный уже при правильном разрешении)

кода можно загрузить с http://www.mpeg.org/MPEG/video/mssg-free-mpeg-software.html ниже кода из файла readpic.c

/* vertical filter and 2:1 subsampling */ 
static void conv422to420(src,dst) 
unsigned char *src, *dst; 
{ 
    int w, i, j, jm6, jm5, jm4, jm3, jm2, jm1; 
    int jp1, jp2, jp3, jp4, jp5, jp6; 

    w = width>>1; 

    if (prog_frame) 
    { 
    /* intra frame */ 
    for (i=0; i<w; i++) 
    { 
     for (j=0; j<height; j+=2) 
     { 
     jm5 = (j<5) ? 0 : j-5; 
     jm4 = (j<4) ? 0 : j-4; 
     jm3 = (j<3) ? 0 : j-3; 
     jm2 = (j<2) ? 0 : j-2; 
     jm1 = (j<1) ? 0 : j-1; 
     jp1 = (j<height-1) ? j+1 : height-1; 
     jp2 = (j<height-2) ? j+2 : height-1; 
     jp3 = (j<height-3) ? j+3 : height-1; 
     jp4 = (j<height-4) ? j+4 : height-1; 
     jp5 = (j<height-5) ? j+5 : height-1; 
     jp6 = (j<height-5) ? j+6 : height-1; 

     /* FIR filter with 0.5 sample interval phase shift */ 
     dst[w*(j>>1)] = clp[(int)(228*(src[w*j]+src[w*jp1]) 
          +70*(src[w*jm1]+src[w*jp2]) 
          -37*(src[w*jm2]+src[w*jp3]) 
          -21*(src[w*jm3]+src[w*jp4]) 
          +11*(src[w*jm4]+src[w*jp5]) 
          + 5*(src[w*jm5]+src[w*jp6])+256)>>9]; 
     } 
     src++; 
     dst++; 
    } 
    } 
} 

Надеюсь, это поможет.

+0

Ссылка на код MPEG, к сожалению, не работает. Но хорошо, что вы опубликовали это. – Thorben