2014-04-24 18 views
-1

我正在尋找如何在指定的地點列表品嚐用OpenGL圖像一些指針圖像的不規則採樣。任何指向類似於下面的問題的教程或例子的鏈接?使用OpenGL

目前,我們有計算在指定位置x1,y1, x2,y2, ..., xn,yn施加Lanczos2濾波器對輸入圖像的列表中的「輸出強度」的代碼。目前的位置數量是20(這實際上是視覺假體中光幻想位置的列表),但它最終會增加到256,而GPU處理肯定會加速事情。位置列表不能被硬編碼。

到目前爲止,我已經看到了如何實現中值濾波和一致好評,但對我來說也沒有必要來計算與濾波器內核卷積在每個圖像像素,只是在指定的位置。

+0

你的意思OpenGL或OpenCL的(或CUDA)?如果你沒有與OpenGL渲染等嚴格相關的任務,後面的一個可能會更好...... – Mailerdaimon

+0

只有OpenGL。 OpenGL ES 2.0將是理想的。 –

+0

您的目標是創建一個新圖像,使用這些位置作爲每個像素的偏移量從原始重採樣? – GuyRT

回答

0

手柄在具有樣品或沒有被比特的第二紋理的那些值(intesity)。

0

如果您使用OpenGL,你就可以定義,圖像的部分要應用編輯或處理,因爲你描述的ROI(感興趣區域)。

如果你走這條路,你這是怎麼計算使用OpenGL ES您所選擇的像素鄰域半徑2.0/3.0的中位數:

kernel vec4 medianUnsharpKernel(sampler u) { 
vec4 pixel = unpremultiply(sample(u, samplerCoord(u))); 
vec2 xy = destCoord(); 
int radius = 3; 
int bounds = (radius - 1)/2; 
vec4 sum = vec4(0.0); 
for (int i = (0 - bounds); i <= bounds; i++) 
{ 
    for (int j = (0 - bounds); j <= bounds; j++) 
    { 
     sum += unpremultiply(sample(u, samplerTransform(u, vec2(xy + vec2(i, j))))); 
    } 
} 
vec4 mean = vec4(sum/vec4(pow(float(radius), 2.0))); 
float mean_avg = float(mean); 
float comp_avg = 0.0; 
vec4 comp = vec4(0.0); 
vec4 median = mean; 
for (int i = (0 - bounds); i <= bounds; i++) 
{ 
    for (int j = (0 - bounds); j <= bounds; j++) 
    { 
     comp = unpremultiply(sample(u, samplerTransform(u, vec2(xy + vec2(i, j))))); 
     comp_avg = float(comp); 
     median = (comp_avg < mean_avg) ? max(median, comp) : median; 
    } 
} 

return premultiply(vec4(vec3(abs(pixel.rgb - median.rgb)), 1.0)); 
} 

的步驟簡要說明 1.計算在3×3鄰域中圍繞源像素的像素值的均值; 2.找到相同鄰域內小於平均值的所有像素的最大像素值。 3. [可選]從源像素值中減去邊緣檢測的中值像素值。

如果您使用邊緣檢測的中值,有幾種方法可以修改上述代碼以獲得更好的結果,即混合中值濾波和截斷媒體濾波(替代和更好的「模式」濾波)。如果您有興趣,請詢問。