void main(void) {
int i;
vec4 sum = vec4 (0.0);
for (i =0: i < Kernel Size: i++)
sum += texture2D(BaseImage. gl_TexCoord[0].st + 0ffset[i]):
gl_FragColor = sum * ScaleFactor;
}

Этот способ сглаживания обычно применяется для уменьшения шума. Прием хорошо работает в областях сплошного цвета или интенсивности, однако получается побочный эффект размывания краев областей. Избежать этой проблемы поможет сверточ-ный фильтр, например фильтр Гаусса, который можно задать в ядре таким образом:

1/273 4/273 7/273 4/273 1/273
4/273 16/273 26/273 16/273 4/273
7/273 26/273 41/273 26/273 7/273
4/273 16/273 26/273 16/273 4/273
1/273 4/273 7/273 4/273 1/273

В листинге 16.8 приведен код для более общего шейдера свертки. Этот шейдер может работать с ядрами, содержащими до 25 элементов. В этом шейдере каждый элемент ядра должен умножаться на коэффициент масштабирования, поэтому не нужно масштабировать сумму.

Листинг 16.8. Фрагментный шейдер для общих вычислений свертки

// Максимальный размер ядра, поддерживаемый этим шейдером const int MaxKernelSize = 25:

// Массив со значениями сдвигов для доступа к основному изображению uniform vec2 Offset[MaxKernelSize];

// Размеры ядра (width * height) uniform int Kernel Size;

// Значение для каждой точки ядра uniform vec4 KernelValue[MaxKernelSize];

// Основное изображение

uniform sampler2D Baselmage; продолжение &

Шейдеры для обработки изображения

Листинг 16.8 (продолжение)

void main(void) {
int і :
vec4 sum = vec4 (0.0);
for (і = 0; і < KernelSize; i++) {
vec4 tmp = texture2D(BaseImage. gl_TexCoord[0],st + Offset[i]); sum +- tmp * Kernel Value[i]:
}
gl_FragColor = sum;
}

К исходному изображению (рис. 16.1, а) добавили шум, и получилось то, что изображено на рис. 16.1, е. Затем шум был удален с помощью фильтра Гаусса, результат показан на рис. 16.1, г. Следует заметить, что шум значительно уменьшился в областях с относительно постоянной интенсивностью.

Результаты различных операций

Рис. 16.1. Результаты различных операций: а- исходное черно-белое изображение 512 х 512; б - усреднение 5x5 соседних пикселов; в - добавление шума к оригиналу; г - понижение шума фильтром Гаусса


⇐ Предыдущая| |Следующая ⇒