Вот как вычислить медиану в выбранном вами радиусе соседства пикселей:
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. Вычислить среднее значение пикселей, окружающих исходный пиксель в окрестности 3x3; 2. Найдите максимальное значение пикселя для всех пикселов в той же окрестности, которые меньше среднего. 3. [ДОПОЛНИТЕЛЬНО] Вычтите срединное значение пикселя из значения исходного пикселя для обнаружения края.
Если вы используете медианное значение для обнаружения краев, есть несколько способов изменить приведенный выше код для получения лучших результатов, а именно гибридная медианная фильтрация и усеченная фильтрация медиа (замена и лучшая фильтрация «режим»). Если вы заинтересованы, пожалуйста, спросите.
person
James Bush
schedule
04.07.2015