2013-04-12 6 views
3

У меня проблема с фильтром изображений OpenCL, который я пытался получить. Я написал многие из них до (Собела пограничного обнаружения, Auto Сегментация и такие), так что я подумал, я знал, как это сделать, но следующий код дает мне какой-то странный результат:OpenCL создает неправильные цвета

//NoRedPixels.cl 

__kernel void NoRedPixels(
    __read_only image2d_t srcImg, 
    __write_only image2d_t dstImg, 
    sampler_t sampler, 
    int width, int height, 
    int threshold, 
    int colour, 
    int fill) 
{ 
    int2 imageCoordinate = (int2)(get_global_id(0), get_global_id(1)); 

    if (imageCoordinate.x < width && imageCoordinate.y < height) 
    { 

     float4 pixel = read_imagef(srcImg, sampler, imageCoordinate); 
     float4 blue = (float4)(0.0f,0.0f,1.0f,1.0f); 

     if (1.0f - pixel.x <= 0.1f) 
      write_imagef(dstImg, imageCoordinate, blue); 
     else 
      write_imagef(dstImg, imageCoordinate, pixel); 
    } 
} 

Итак, для тестирования все, что я хочу сделать, это заменить красные пиксели синими, но этот код заменит все соответствующие пиксели на WHITE. Насколько я знаю, мое форматирование для синего - это правильное форматирование RGBA для создания чистого синего (я делал это раньше без проблем).

Я использую PyOpenCL в качестве своей структуры, и я обязательно установил порядок каналов изображения как для исходного, так и для целевого изображений как RGBA. Кроме того, я также должен был преобразовать исходное изображение в формат RGBA (используя библиотеку изображений Python), если он еще не был в этом формате, прежде чем запускать на нем ядро.

Я вернулся и посмотрел на другие ядра, которые я написал, и форматирование идентично. Что мне здесь не хватает, что заставит его писать белые пиксели вместо синих?

+0

Если вы просто прочитали пиксель, разложите его на свои компоненты, восстановите его как float4, а затем напишите его, останется ли изображение неизменным? Что делать, если вы используете (1.0f, 0.0f, 0.0f, 1.0f) или (0.0f, 1.0f, 0.0f, 1.0f) в качестве пикселя замены? Ведут ли они себя так, как ожидалось? – int3h

+0

Я играл со всеми значениями синего float4 без эффекта. По какой-либо причине он не применяет цвет, который float4 должен представлять на целевом изображении. Я попытался использовать int4 с write_imagei вместо float4 и write_imagef, и это тоже не повлияло. – Switch

+0

Извините, я не ответил на первую часть вашего вопроса. Я попытался вручную назначить каждое значение другому float4 (например, item.x = 255, item.y = 0 и т. Д.) Без везения. – Switch

ответ

4

Хорошо, поэтому я думаю, что понял это. По какой-то причине OpenCL не очень увлекается тем, что вы можете редактировать каналы так, как я хотел. Я решил это решить, просто добавив или вычитая эквивалентные векторы float4, чтобы получить результирующий вектор, который я хотел.

__kernel void NoRedPixels(__read_only image2d_t srcImg, __write_only image2d_t dstImg, 
sampler_t sampler, int width, int height, int threshold, int colour, int fill) 
{ 
    int2 imageCoordinate = (int2) (get_global_id(0), get_global_id(1)); 
    if (imageCoordinate.x < width && imageCoordinate.y < height) 
    { 
     float4 pix = read_imagef(srcImg, sampler, (int2)(imageCoordinate.x, imageCoordinate.y)); 

     //Full red channel, subtract this from original to remove red! 
     float4 red = (float4)(1.0f, 0.0f, 0.0f, 0.0f); 
     float4 blue = (float4)(0.0f, 0.0f, 1.0f, 0.0f); 

    if (pix.x >= 0.9f && pix.y <= 0.1f && pix.z <= 0.1f) //If red, then replace with blue. 
    { 
     const float4 outColor = pix - red + blue; 
     write_imagef(dstImg, imageCoordinate, outColor); 
    } 
    else 
     write_imagef(dstImg, imageCoordinate, pix); 

    } 
} 

Таким образом, в этом случае, за счет создания векторов для представления синего и красного цвета (без прозрачности) вычитанием красного, а затем добавить синий, я получаю результирующий вектор я хотел. Лично я не уверен, почему я должен это делать, но я просто рад, что знаю, что OpenCL ожидает от меня. Надеюсь, если кто-то еще столкнется с этой проблемой, они найдут это здесь.

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