2014-04-24 2 views
-1

OpenGL을 사용하여 지정된 위치 목록에서 이미지를 샘플링하는 방법에 대한 몇 가지 지침을 찾고 있습니다. 튜토리얼 또는 예제에 대한 링크는 아래의 문제와 유사합니까?OpenGL을 사용하는 이미지의 불규칙 샘플링

현재로서는 지정된 위치 목록에서 '출력 강도'를 계산하는 코드가 있습니다. x1,y1, x2,y2, ..., xn,yn 입력 이미지에 Lanczos2 필터를 적용합니다. 현재 위치의 양은 20입니다 (실제로는 시각 보철물의 phosphene 위치 목록입니다). 그러나 결국 최대 256까지 증가 할 것이고 GPU 처리는 확실히 가속화 할 것입니다. 위치 목록을 하드 코드 할 수 없습니다.

지금까지 median 필터와 비슷하게 구현하는 방법을 보았습니다. 그러나 제 경우에는 지정된 위치에서 모든 이미지 픽셀의 필터 커널과의 회선을 계산할 필요가 없습니다.

+0

OpenGL 또는 OpenCL (또는 CUDA)을 의미합니까? OpenGL 렌더링과 관련된 작업이 엄격히 필요하지 않은 경우 나중에 더 나은 것일 수도 있습니다. – Mailerdaimon

+0

OpenGL 만 가능합니다. OpenGL ES 2.0이 이상적입니다. –

+0

새 이미지를 만들려는 목적이이 위치를 각 픽셀의 오프셋으로 사용하여 원본에서 리샘플링됩니까? – GuyRT

답변

0

샘플 또는 비트가없는 두 번째 텍스처의 값 (intesity)을 처리합니다.

0

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을 계산 3x3 근방에서 소스 픽셀을 에워싸는 픽셀의 값의 평균; 2. 같은 이웃에서 평균보다 작은 모든 픽셀의 최대 픽셀 값을 찾습니다. 3. [선택 사항] 가장자리 감지를 위해 원본 픽셀 값에서 중간 픽셀 값을 뺍니다.

가장자리 감지에 중간 값을 사용하는 경우 위의 코드를 수정하여 하이브리드 중간 필터링 및 잘린 미디어 필터링 (더 나은 '모드'필터링). 관심이 있으시면, 물어보십시오.