У меня проблема с фильтром изображений 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), если он еще не был в этом формате, прежде чем запускать на нем ядро.
Я вернулся и посмотрел на другие ядра, которые я написал, и форматирование идентично. Что мне здесь не хватает, что заставит его писать белые пиксели вместо синих?
Если вы просто прочитали пиксель, разложите его на свои компоненты, восстановите его как float4, а затем напишите его, останется ли изображение неизменным? Что делать, если вы используете (1.0f, 0.0f, 0.0f, 1.0f) или (0.0f, 1.0f, 0.0f, 1.0f) в качестве пикселя замены? Ведут ли они себя так, как ожидалось? – int3h
Я играл со всеми значениями синего float4 без эффекта. По какой-либо причине он не применяет цвет, который float4 должен представлять на целевом изображении. Я попытался использовать int4 с write_imagei вместо float4 и write_imagef, и это тоже не повлияло. – Switch
Извините, я не ответил на первую часть вашего вопроса. Я попытался вручную назначить каждое значение другому float4 (например, item.x = 255, item.y = 0 и т. Д.) Без везения. – Switch