'CUDA'에 해당되는 글 1건

  1. 2010.01.13 Laplacian Pyramid on GPU (1)

Laplacian Pyramid on GPU

공부 2010.01.13 23:17
이번 GPU수업을 들으면서 했던 숙제 중에 하나가 Laplacian pyramid와 Gaussian pyramid를 구현하고, 그것을 이용해서 이미지 모자이크를 만드는 것이었다.

(그림출처: http://fourier.eng.hmc.edu/e161/lectures/canny/node3.html)

라플라시안 피라미드의 기본적인 원리는 이미지를 확장했을때 원본과의 차이를 저장해놓는 것이다.
예를들어 위의 그림 라플라스 피라미드의 제일 아래의 이미지를 가로세로 각각 2배로 확장을 하더라도 가우시안 피라미드의 2번째 그림과 같은 깔끔한 결과를 '바로' 얻을 수는 없다.(일반적으로 이미지 리사이즈를 해서 크기를 키웠을때 결과가 깔끔하지 않은것을 생각해보면 된다)
하지만 라플라스 피라미드 2번째에 저장되어있는 차이를 이용해서 보정을 하면 똑같은 깔끔한 결과를 얻을 수 있고, 이것을 반복하면 가우시안 피라미드 제일 위쪽에 있는것과 같은 깔끔한 원본그림을 얻을 수 있는것이다.


그리고 이 과정에서 mask를 지정해서 두 이미지를 합성하면, 아래와 같이 부드럽게 합성이 된다.
합성할 이미지1. 내손.



합성할 이미지 2. 왼쪽눈을 손바닥 위치에 맞추기 위해서 대강 잘라서 위치를 수정했다.

mask. 흰색은 1번이미지, 검은색은 2번이미지가 차지할 영역이다.



결과물. mask의 경계선이 부드럽게 처리되면서 두 1,2번 이미지가 결합된다.


사실 이 방법은 이미 내가 태어나기도 전에 나왔던 논문에 실린 방법이라 요즘의 계산사진학의 결과물에 비할바는 아닌데다가, 굳이 GPU까지 써가면서 가속할 필요도 없어보이는 작업이다.
사실 애초에 mask를 부드럽게 하는것만으로도 비슷한 결과를 얻을 수 있어 보이기도 한다.
하지만 image pyramid는 SIMD계열의 parallel머신에서 계산을 할때 종종 마주하게되는 난감한 문제인 data packing이라거나 expansion같은 기본적인 문제의 해결과도 관련이 있기 때문에 한번쯤 연습해보는것도 괜찮은것 같다.


포스팅 하는김에 내가 CUDA로 작성한 코드도 올린다.

CUDA의 기본프로젝트에 있는 recursiveGaussian에서 내가 필요한 부분만 수정했다.
나도 저때 CUDA를 막 배우기 시작한터라 깔끔한 코드는 아니지만, 처음 CUDA를 시작하는 사람에게는STL과 CUDA를 같이 사용해서 GPU메모리를 관리하는 좋은 예제가 될 수 있을듯?
(*vs2005에서 구현하고 돌려봤다. 근데 Linux용 CUDA컴파일러에서는 버그가 있어서 STL을 사용할경우 문제가 생길 수도 있으니 주의!)

Ref : PETER J. BURT, EDWARD H. ADELSON, A Multiresolution Spline With Application to Image Mosaics(1983)
신고

'공부' 카테고리의 다른 글

Google Summer of Code2010 & CGAL  (0) 2010.03.30
O/R mapping  (0) 2010.02.26
Laplacian Pyramid on GPU  (1) 2010.01.13
Block-based Web Search  (0) 2009.12.06
오토 레포트  (3) 2009.11.04
Constructive Logic  (3) 2009.09.22
Posted by youknow04


티스토리 툴바