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

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

Upload: steel-hunt

Post on 30-Dec-2015

51 views

Category:

Documents


0 download

DESCRIPTION

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

TRANSCRIPT

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

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

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

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

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

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

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

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

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

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

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

image1

image2

imageN

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

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

Обработка изображений на Обработка изображений на 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;}

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

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

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

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

Обработка изображений на Обработка изображений на 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 );}

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

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

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

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

Обработка изображений на Обработка изображений на 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 );}

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

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

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

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

Обработка изображений на Обработка изображений на 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 );}

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

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

r

rl

r

rmmjlimlji ckc ,,,ˆ

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

mlk ,

jic ,ˆ

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

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

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

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

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

((edge-detectedge-detect) )

1,1,,1,1,ˆ

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

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

Обработка изображений на Обработка изображений на 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 );}

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

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

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

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

22, exp jkikCk ji

r

rl

r

rmmjlimlji ckkc ,,

ˆˆˆ

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

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

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

2exp lkCkl

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

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

buffer1 buffer2 buffer1

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

x-blur y-blur

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

Обработка изображений на Обработка изображений на 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 );}

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

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

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

111

111

111

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

Обработка изображений на Обработка изображений на 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 );}

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

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

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

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

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

jijiji CkCC ,,, 1ˆ

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

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

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

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

S

V

0.0

1.0

Черный

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

Красный

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

Голубой

BGRVkSkHkVSHBGR ,,,,,,,,

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

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

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

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

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

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

Обработка изображений на Обработка изображений на 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 );

}

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

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

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

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

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

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

Обработка изображений на Обработка изображений на 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;};

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

Обработка изображений на Обработка изображений на 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;}

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

Обработка изображений на Обработка изображений на 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 );}

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

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

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

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

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

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

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

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

Обработка изображений на Обработка изображений на 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) );

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

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

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

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