2013-03-13 10 views
2

Я только начал использовать оптимизацию обработки изображений SS2, но для 3-канальных 24-битных цветных изображений понятия не имею. Мои пиксельные данные, организованные BGR BGR BGR ..., unsigned char 8-bi, поэтому, если я хочу реализовать Color2Gray с инструкцией C/C++ для SSE2/SSE3/SSE4, как бы мне это сделать? Нужно ли выровнять (4/8/16) для моих данных pix? Я прочитал статью: http://supercomputingblog.com/windows/image-processing-with-sse/ Но это ARGB 4-канальный 32-битный цвет, точно обрабатывает 4 цветных пиксельных данных каждый раз. Спасибо!Как обрабатывать 24-битное трехканальное цветное изображение с SSE2/SSE3/SSE4?

//Assume the original pixel: 
     unsigned char* pDataColor=(unsigned char*)malloc(src.width*src.height*3);//3 

    //init pDataColor every pix val 
    // The dst pixel: 
    unsigned char* pDataGray=(unsigned char*)malloc(src.width*src.height*1);//1 

// RGB-> Серый: Y = 0,212671 * R + 0,715160 * G + 0,072169 * B

ответ

2

Вот некоторые ответы на ваш вопрос:

  • Как использовать SSE2 инструкции C/C++. Эти ссылки могут быть полезны.
  • Для выравнивания: Да, 16-байтовое выравнивание необходимо. Когда доступ к памяти осуществляется с использованием встроенных функций SSE2 (функции C/C++ для SSE2/SSE3/SSE4), вы должны убедиться, что адрес памяти равен 16-байтовому выравниванию. Если вы используете MSVC, вам нужно будет использовать declspec(align(16)) или с GCC, это будет __attribute((aligned (16))).
  • Для 3-канального RGB преобразования, я не эксперты обработки изображений, поэтому не могу дать совет. Существуют также библиотеки для обработки изображений с открытым исходным кодом, которые могут содержать код, который вы хотите.
5

У меня есть слайды на de-interleaving of 24-bit RGB pixels, которые объясняют, как это сделать с SSE2 и SSSE3.

+0

Да, спасибо. У меня есть полный цвет RGB ... RGB до RR ... BB ... GG, но когда я пытаюсь сделать: RGB-> Gray: Y = 0.212671 * R + 0.715160 * G + 0.072169 * B. Есть проблемы. поскольку SSE использует 128-битную команду, нет никакой инструкции по управлению SSE C/C++, которая может работать как: _mm_mul_xxx (a0, b0); r0 = a0 * b0, r1 = a1 * b0, ..., r15 = a15 * b0; (a0 - 16 типов, b0 - два двойных типа). ???? – user2163635

+0

Для преобразования цветов обычно используется арифметика с фиксированной точкой вместо плавающей запятой. Распакуйте 8-битные значения в 16-битные значения (используя _mm_unpacklo_epi8/_mm_unpackhi_epi8), а затем используйте целочисленное умножение 16-битных значений. –

 Смежные вопросы

  • Нет связанных вопросов^_^