我遇到OpenCL圖像過濾器的問題我一直在努力工作。 我已經寫了很多這樣的(Sobel邊緣檢測,自動分割,而這樣)之前,所以我以爲我知道如何做到這一點,但下面的代碼是給我一些很奇怪的輸出: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);
}
}
因此,爲了測試,我想要做的是用藍色取代紅色像素,但是這個代碼將用白色取代所有匹配的像素。 據我所知,我的藍色格式是正確的RGBA格式用於創建純藍色(我之前沒有問題完成此操作)。
我使用PyOpenCL作爲我的框架,並且我已經確保將源圖像和目標圖像的圖像通道順序設置爲RGBA。另外,如果在運行內核之前還沒有使用該格式,我還一定要將源圖像轉換爲RGBA格式(使用Python Imaging Library)。
我回頭看看我編寫的其他內核,格式是相同的。我在這裏錯過什麼會導致它寫出白色像素而不是藍色像素?
如果您只是讀取一個像素,將其分解爲其組件,將其重構爲float4,然後寫入它,圖像是否保持不變?如果使用(1.0f,0.0f,0.0f,1.0f)或(0.0f,1.0f,0.0f,1.0f)作爲替換像素,那麼該怎麼辦?這些行爲是否像預期的那樣? – int3h
我玩弄了藍色float4的所有值,沒有任何效果。無論出於何種原因,它都不會將float4應該表示的顏色應用於目標圖像。 我試過用write_imagei代替float4和write_imagef來使用int4,它也沒有效果。 – Switch
對不起,我沒有回答你問題的第一部分。我沒有嘗試手動將每個值分配給不同的float4(比如item.x = 255,item.y = 0等)。 – Switch