如果您使用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. [可選]從源像素值中減去邊緣檢測的中值像素值。
如果您使用邊緣檢測的中值,有幾種方法可以修改上述代碼以獲得更好的結果,即混合中值濾波和截斷媒體濾波(替代和更好的「模式」濾波)。如果您有興趣,請詢問。
你的意思OpenGL或OpenCL的(或CUDA)?如果你沒有與OpenGL渲染等嚴格相關的任務,後面的一個可能會更好...... – Mailerdaimon
只有OpenGL。 OpenGL ES 2.0將是理想的。 –
您的目標是創建一個新圖像,使用這些位置作爲每個像素的偏移量從原始重採樣? – GuyRT