2012-09-24 4 views
4

일반 C++을 사용하여 끊김없는 블렌딩을위한 이미지 혼합 방법을 구현했습니다. 이제이 코드를 GPU (OpenGL ES 2 Shaders for mobile devices 사용)로 변환하고 싶습니다. 기본적으로이 방법은 각 이미지에 대해 가우스 및 라플라시안 피라미드를 생성 한 다음 저해상도에서부터 최상위로 결합합니다 (Burt et al. 1983의 "라플라시안 피라미드를 컴팩트 이미지 코드"참조).GPU 기반 Laplacian 피라미드

내 문제는 Laplacian 피라미드 레벨이 음수 값을 가질 수 있지만 내 장치가 float 또는 정수 유형 텍스처 (예 : ORB_texture_float 확장명 사용)를 지원하지 않는다는 것입니다.

GPU 기반 피라미드를 다루는 논문을 찾았지만 정말 유용한 것을 찾지 못했습니다.

  1. GPU에서 어떻게 이러한 피라미드를 효과적으로 구현할 수 있습니까?
  2. 이전 레벨을 반복하지 않고 Gaussian/Laplacian 피라미드 레벨을 계산할 수 있습니까?

감사합니다,

편집 하지 않는 두 개의 패스 (표지판 하나, 값 하나)를 사용하여 제외 GPU에 완전히 라플라시안 피라미드를 계산 할 "좋은"방법이없는 것처럼 보인다 이미지의 데이터 범위가 [0..255] 사이 인 경우 서명 된 유형 (예 : ARB_texture_float) 또는 바이트보다 큰 유형을 지원합니다. 내 Laplacian Pyramid는 ARB_texture_float 확장 기능을 갖춘 GPU에서 완벽하게 실행되지만 확장 기능을 사용하지 않으면 범위 압축으로 인해 피라미드가 "잘못"됩니다. 라플라스와의 픽셀의 부호를 저장하는 또 다른 피라미드의 기울기의 크기를 포함하는 하나의 피라미드 -

답변

5
  1. 텍스쳐가 부호없는 정수가 있다면 당신은 라플라시안 피라미드를 구현하기위한 가장 안전한 방법은 두 개의 피라미드를 저장하는 것입니다 그 위치.

  2. 예. Gaussian 또는 Laplacian 피라미드의 모든 레벨에는 계산하려는 Σ 값을 기반으로 한 닫힌 폼 솔루션이 있습니다. sigma = (2/3)의 간격으로 계산 된 LoG 피라미드의 기본 경우를 고려하십시오. 피라미드의 첫 번째 단계는 시그마 2/3을 가지며 시그마 2/3을 사용하는 5x5 LoG 필터와 컨볼 루션함으로써 간단히 생성됩니다. 동일한 필터를 사용하는 두 번째 회선은 시그마 4/3을 사용하는 LoG 이미지를 생성하고 마지막으로 시그마 6/3 또는 2를 가지므로 이미지를 서브 샘플링하여 피라미드의 다음 정수 수준을 생성합니다. 시그마 2에서 이미지의 LoG를 계산하려면 시그마 2/3 및 4/3의 레벨은 필요하지 않습니다. 이미지를 한 번 서브 샘플링하고 시그마 1을 사용하는 LoG 필터와 컨벌루션합니다.

LoG를 σ = 20으로 계산하려면 이미지 (16 픽셀 블록이 1 픽셀이됩니다)를 4 배 서브 샘플링하여 시그마 16 이미지를 얻은 다음 시그마 4/3 LoG 필터로 한 번 컨볼 루션하십시오.

+0

힌트를 보내 주셔서 감사합니다. 나는 라플라스 피라미드를 두 번 (표지판에 하나, 절대 값으로 하나) 계산해야한다는 것이 맞습니까? – Hyndrix

+0

댓글을 다시 생각한 후에 알파 채널에 RGB 기호를 인코딩 할 수도 있습니다 (사용하지 않음). 피라미드를 두 번 계산하는 것보다 속도가 느릴 수 있지만 장치에 너무 적은 메모리가 저장됩니다. – Hyndrix

+0

알파 채널을 사용하는 것이 좋습니다. 이제 피라미드를 두 번 계산하거나 두 개의 피라미드를 저장할 필요가 없습니다. 필터를 통해 Laplacian 값을 계산하고 부호가있는 변수에 저장하십시오. 부호있는 변수의 abs()를 r/g/b에 두십시오. 부호있는 변수를 텍스처에 저장된 값으로 나눈 다음 결과에 1을 더하고 알파 채널에 저장합니다.알파의 값이 0이고 원래의 그래디언트가 음수이면 2 인 경우 그래디언트가 양수입니다. –