Обработка изображений на GPU

Preview:

DESCRIPTION

Обработка изображений на GPU. Обработка изображений (и видео) довольно часто встречается в раз-личных областях. При этом она зачастую требует проведения весьма сложных вычислений для большого количества пикселов. - PowerPoint PPT Presentation

Citation preview

Обработка изображений на Обработка изображений на GPUGPU

Обработка изображений (и видео) довольно часто встречается в раз-личных областях. При этом она зачастую требует проведения весьма сложных вычислений для большого количества пикселов.Кроме того, во многих случаях требуется высокая точность (т.е. 8 бит на компоненту явно недостаточно

Все это очень хорошо ложится на модель программирования GPU.Использование GPU позволяет параллельно обрабатывать огромное количество пикселов, задавая их как четырехмерные вещественные вектора

Обработка изображений на Обработка изображений на GPUGPU

Операционная система Mac OS X содержит модуль CoreImage, обеспечивающий обработку изображений средствами GPU.В него входят десятки стандартных фильтров и возможность написания своих фильтров на специальном языке - подмножестве GLSL

Сама система Mac OS X уже давно использует GPU для вывода данных на экран, используя мощные возможности современных GPU для полноценной поддержки полупрозрачности, преобразований и многих других эффектов.

Обработка изображений на Обработка изображений на GPU - общая GPU - общая схемасхема

Помещаем исходные изображения в текстуры (можно с float-форматом), вывод осуществляется в р-буфер или FBO.Средствами OpenGL осуществляется вывод прямоугольника, соответствующего выходному изображению.

image1

image2

imageN

Фрагментная программа outImage

Обработка изображений на Обработка изображений на GPU - вершинная GPU - вершинная программапрограмма

struct InData{ float4 pos : POSITION; float2 texCoord : TEXCOORD0;};struct OutData{ float4 pos : POSITION; float2 texCoord : TEXCOORD0;};OutData main ( InData IN, uniform float4x4 ModelViewProj ){ OutData OUT;

OUT.pos = mul ( ModelViewProj, IN.pos ); OUT.texCoord = IN.texCoord;

return OUT;}

Обработка изображений на Обработка изображений на GPUGPUПример: перевод в оттенки серого цветаПример: перевод в оттенки серого цвета

Формула преобразования: С = 0.3 * Red +0.59 * Green + 0.11 * Blue

Обработка изображений на Обработка изображений на GPUGPUПример: перевод в оттенки серого цветаПример: перевод в оттенки серого цвета

struct InData{ float4 pos : POSITION; float2 texCoord : TEXCOORD0;};

float4 main ( InData IN, uniform sampler2D tex0 ) : COLOR{ const float3 luminance = float3 ( 0.3, 0.59, 0.11 );

float4 color = tex2D ( tex0, IN.texCoord );

return float4 ( float3 ( dot ( color.rgb, luminance ) ), 1.0 );}

Обработка изображений на Обработка изображений на GPUGPUПример: Пример: SepiaSepia

Формула преобразования: С = sepiaColor*(0.3 * Red +0.59 * Green + 0.11 * Blue)

Обработка изображений на Обработка изображений на GPUGPUПример: Пример: SepiaSepia

struct InData{ float4 pos : POSITION; float2 texCoord : TEXCOORD0;};

float4 main ( InData IN, uniform sampler2D tex0 ) : COLOR{ const float3 luminance = float3 ( 0.3, 0.59, 0.11 ); const float3 sepiaColor = float3 ( 1, 0.89, 0.54 );

float4 color = tex2D ( tex0, IN.texCoord );

return float4 ( dot ( color.rgb, luminance ) * sepiaColor, 1.0 );}

Обработка изображений на Обработка изображений на GPUGPUПример: гамма-коррекцияПример: гамма-коррекция

Формула преобразования: С = pow ( C, 1 / gamma )

Обработка изображений на Обработка изображений на GPUGPUПример: гамма-коррекцияПример: гамма-коррекция

struct InData{ float4 pos : POSITION; float2 texCoord : TEXCOORD0;};

float4 main ( InData IN, uniform float gamma, uniform sampler2D tex0 ) : COLOR{

float3 color = tex2D ( tex0, IN.texCoord ).rgb;

return float4 ( pow ( color, 1.0 / gamma ), 1.0 );}

Обработка изображений на Обработка изображений на GPUGPUСвертка при помощи ядраСвертка при помощи ядра

r

rl

r

rmmjlimlji ckc ,,,ˆ

Общий случай:

mlk ,

jic ,ˆ

jic , - элементы исходного изображения

- элементы выходного изображения

- ядро свертки (3*3,5*5,….N*N)

Обработка изображений на Обработка изображений на GPU GPU ПримерПример - фильтр выделения границ - фильтр выделения границ

((edge-detectedge-detect) )

1,1,,1,1,ˆ

jijijijiji IIIIkIПреобразование интенсивности:

Обработка изображений на Обработка изображений на GPU GPU ПримерПример - фильтр выделения границ - фильтр выделения границ

((edge-detectedge-detect) )

float4 main ( InData IN, uniform sampler2D tex0 ) : COLOR{

const float3 lum = float3 ( 0.3, 0.59, 0.11 );const float2 d01 = float2 ( 0, 1.0 / 512.0 );const float2 d10 = float2 ( 1.0 / 512.0, 0 );const float scale = 1.0;

float c1 = dot( lum, tex2D( tex0, IN.texCoord+d01 ).rgb );float c2 = dot( lum, tex2D( tex0, IN.texCoord-d01 ).rgb );float c3 = dot( lum, tex2D( tex0, IN.texCoord+d10 ).rgb );float c4 = dot( lum, tex2D( tex0, IN.texCoord-d10 ).rgb );

return float4 ( float3 ( scale * ( abs( c1 - c2 ) + abs( c2 - c3 ) ) ), 1 );}

Обработка изображений на Обработка изображений на GPUGPUПример - BlurПример - Blur (размытие) (размытие)

Обработка изображений на Обработка изображений на GPUGPUПример - BlurПример - Blur (размытие) (размытие)

22, exp jkikCk ji

r

rl

r

rmmjlimlji ckkc ,,

ˆˆˆ

Размытие с ядром Гаусса:

Заметим, что: 22, expexp jkCikCk ji

Отсюда получаем:

2exp lkCkl

Обработка изображений на Обработка изображений на GPUGPUПример - BlurПример - Blur (размытие) (размытие)

buffer1 buffer2 buffer1

Таким образом можно 2-мерное размытие свести к 2 двум одномерным - сперва по х, а потом - по у.Ядро, обладающее подобным свойством называется разделяемым (separable).При этом понадобится вспомогательный буфер

x-blur y-blur

Обработка изображений на Обработка изображений на GPUGPUПример - BlurПример - Blur (размытие) (размытие)

//// x-blur fragment shader//float4 main ( InData IN, uniform sampler2D tex0 ) : COLOR{

float3 sum = float3 ( 0.0 );float2 dx = float2 ( 1.0 / 512.0, 0.0 );float2 tx = IN.texCoord - 3.0 * dx;

for ( int i = 0; i < 7; i++ ){

sum += tex2D ( tex0, tx ).rgb;tx += dx;

}

return float4 ( sum / 7.0, 1.0 );}

Обработка изображений на Обработка изображений на GPUGPUПример - embossПример - emboss

Ядро (применяемое к интенсивности):

111

111

111

Обработка изображений на Обработка изображений на GPUGPUПример - embossПример - emboss

float4 main ( InData IN, uniform sampler2D tex ) : COLOR{ const float3 lum = float3 ( 0.3, 0.59, 0.11 ); const float2 d01 = float2 ( 0, 1.0 / 512.0 ); const float2 d10 = float2 ( 1.0 / 512.0, 0 );

float c00 = dot(lum, tex2D(tex, IN.texCoord-d01-d10).rgb); float c01 = dot(lum, tex2D(tex, IN.texCoord-d10).rgb); float c02 = dot(lum, tex2D(tex, IN.texCoord+d01-d10).rgb ); float c10 = dot(lum, tex2D(tex, IN.texCoord-d01).rgb ); float c11 = dot(lum, tex2D(tex, IN.texCoord).rgb ); float c12 = dot(lum, tex2D(tex, IN.texCoord+d01).rgb ); float c20 = dot(lum, tex2D(tex, IN.texCoord+d10-d01).rgb ); float c21 = dot(lum, tex2D(tex, IN.texCoord+d10).rgb ); float c22 = dot(lum, tex2D(tex, IN.texCoord+d10+d01).rgb ); float res = c00 + c01 - c02 + c10 + c11 - c12 + c20 - c21 - c22; return float4 ( res, res, res, 1.0 );}

Обработка изображений на Обработка изображений на GPUGPUПример - enhanceПример - enhance

Обработка изображений на Обработка изображений на GPUGPUПример - enhanceПример - enhance

Применяемое преобразование:

jijiji CkCC ,,, 1ˆ

jijijijijiji CCCCCC ,1,11,,1,1, 4

Разностный аналог оператора Лапласа:

Обработка изображений на Обработка изображений на GPUGPUПреобразования цветов в пространстве Преобразования цветов в пространстве HSVHSV

S

V

0.0

1.0

Черный

Синий Малиновый

Красный

ЖелтыйЗеленый

Голубой

BGRVkSkHkVSHBGR ,,,,,,,,

Модель HSV:• H (Hue) - тон ([0,360)),• S (Saturation) - насыщенность ([0,1]),• V (Value) - интенсивность (яркость) [0,1])

Обработка изображений на Обработка изображений на GPUGPUПреобразования цветов в пространстве Преобразования цветов в пространстве HSVHSV

Обработка изображений на Обработка изображений на GPUGPUПреобразования цветов в пространстве Преобразования цветов в пространстве HSVHSV

Обработка изображений на Обработка изображений на GPUGPUПреобразования цветов в пространстве Преобразования цветов в пространстве HSVHSV

float3 rgbToHsv ( const in float3 c ){

float mn = min ( min ( c.r, c.g ), c.b );float mx = max ( max ( c.r, c.g ), c.b );float delta = mx - mn;

float v = mx, h = 0.0, s = 0.0;

if ( mx > EPS ){

s = delta / mx;if ( c.r == mx )

h = ( c.g - c.b ) / delta;else if ( c.g == mx )

h = 2.0 + ( c.b - c.r ) / delta;else

h = 4.0 + ( c.r - c.g ) / delta;}return float3 ( h / 6.0, s, v );

}

Обработка изображений на Обработка изображений на GPUGPUПример - эффект старого фильмаПример - эффект старого фильма

Обработка изображений на Обработка изображений на GPUGPUПример - эффект старого фильмаПример - эффект старого фильма

Основные элементы:• дергание (shudder) исходного изображения,• изменения яркости,• царапины,• волоски, пылинки и прочий мусор

Обработка изображений на Обработка изображений на GPUGPUЭффект старого фильма, вершинная Эффект старого фильма, вершинная

программапрограммаstruct InData{ float4 pos : POSITION; float2 texCoord : TEXCOORD0;};

struct OutData{ float4 pos : POSITION; float2 texCoord : TEXCOORD0; float2 shudder; float2 blipCoord; float2 scratchCoord; float brightness;};

Обработка изображений на Обработка изображений на GPUGPU Эффект старого фильма, вершинная Эффект старого фильма, вершинная

программапрограммаOutData main ( InData IN,uniform float time, uniform float4x4 ModelViewProj ){ OutData OUT;

OUT.shudder = IN.texCoord + C1* float2 ( sin(time*C2), cos(time*C3)); OUT.brightness = clamp(3.0*sin(time*C4), 0.7, 1.0 ); OUT.blipCoord = C5*IN.texCoord + float2(sin(C6*time)+cos(C7*time ), cos(C8*time)+sin(C9*time)); OUT.scratchCoord= IN.texCoord+float2(C10*cos(C11*time), C12*sin(C13*time)); OUT.pos = mul ( ModelViewProj, IN.pos ); OUT.texCoord = IN.texCoord;

return OUT;}

Обработка изображений на Обработка изображений на GPUGPU Эффект старого фильма, вершинная Эффект старого фильма, вершинная

программапрограмма

float4 main ( OutData IN, uniform sampler2D mainTex, uniform sampler2D scratchTex, uniform sampler2D blipTex ) : COLOR{

const float3 luminance = float3 ( 0.3, 0.59, 0.11 );

float4 color = tex2D ( mainTex, IN.shudder );float4 scratch = tex2D ( scratchTex, IN.scratchCoord );float4 blip = tex2D ( blipTex, IN.blipCoord );float4 outColor = dot ( color.rgb, luminance ) *

IN.brightness * scratch * blip;

return float4 ( outColor.r, outColor.g, outColor.b, 1.0 );}

Обработка изображений на Обработка изображений на GPUGPUПример - эффект перехода к другому Пример - эффект перехода к другому

видеорядувидеоряду

Видеоряд 1 Видеоряд 2

Выходной видеоряд 1

Задача: организовать плавный переход от одного видеоряда к другому

Программа смешения

Обработка изображений на Обработка изображений на GPUGPUПример - эффект перехода к другому Пример - эффект перехода к другому

видеорядувидеоряду

Используем вспомогательную текстуру transMap:

R-компонента - момент начала перехода к второму рядуG-компонента - конец перехода к второму ряду

Закон смешения потоков:

float3 trans = tex2D ( transMap, IN.texCoord ).rgb;float p = clamp ( time, trans.r, trans.g );float4 c1 = tex2D ( image1Map, IN.texCoord );float4 c2 = tex2D ( image2Map, IN.texCoord );

return mix ( c1, c2, (p - trans.r)/(trans.g - trans.r) );

Обработка изображений на Обработка изображений на GPUGPUПример - эффект перехода к другому Пример - эффект перехода к другому

видеорядувидеоряду

В результате мы получили очень гибкий механизм перехода от одного видеоряда к другом - для каждого пиксела задается начало и конец перехода.Внутри интервала переходя происходит линейная интерполяция между цветами

Recommended