갑자기 Image Processing?
- 갑자기 이미지처리를 하냐 하면,, 다 이유가 있다.
- 갑자기그러니까 갑자기 컴퓨터그래픽스 강의 첫시간인가.. 교수님이 영상처리와 컴퓨터그래픽스는 서로 다른 방향의 작업을 수행한다고 하셨던것이 생각난다.
- 영상처리는 이미지에서 데이터를 뽑아 사용하고, 컴퓨터그래픽스는 데이터를 이용해서 이미지를 생성한다.
- 그냥 생각났다.
Shader의 사용
- Drawing
- Rendering
- Computation
- 1, 2 는 이미 많이 사용해보고 들어봐서 알겠지만 3은 생소할지도 모른다.
- 다들 알다시피 GPU는 pixel당 병렬처리가 가능하다. 즉 CPU를 통한 연산보다 훨씬 빠르다는 것
- 그래서 Image Processing과정에서 GPU가 사용되곤 한다.
이걸 GPGPU(General Purpose computation on Graphics Processing Units) 라고 한다.
- GPGPU의 kernel은 Fragment Shader이다. 각 pixel마다 수행한다.
- input: Image / Output: Processed Image
무엇을 할 수 있는가!
Image Negative
- 가장 단순한 이미지처리로, 각 픽셀의 값을 1에서 빼준다. 즉 보색처리
Edge Detection
- 가장자리를 찾아주는 이미지처리로, 주변 픽셀의 색을 탐색하여 전혀 다른색인경우 흰색, 아니면 검은색을 출력한다.
Toon Rendering
- 만화적 효과를 주는 이미지처리로, 비슷한 색인경우 평균색을 출력한다. 전혀 다르다면 검은색을 출력하여 테두리를 표현한다.
이미지 처리를 GPU가 하는것이 옳은가 판단하기
- Image Processing이 data-parallel한가?(데이터 저장결과가 다른 점에 영향이 가지않는가?)
- bus traffic은 어떤가?(CPU와 GPU사이를 왔다갔다 하지않고 한번의 입력으로 처리가 가능한가?)
- 어떤 Shader를 써야하는가?(Fragment Shader를 사용하는가?)
GPU Setup
- Input은 Texture로 주어지는것이 좋다. 그래야 다른 픽셀 데이터에 접근가능이 쉽다.
- Output은 역시 framebuffer
- Kernel은 Fragment Shader
Texture input방법
- 컴퓨터그래픽스과목에서 배웠었던 Texture 처리방법을 리뷰한다.
- Fragment Shader에서 sampler2D와 Demention크기(1/화면가로, 1/화면세로)를 uniform변수로 받아온다.
- Demention크기에 gl_FragCoord.xy를 곱하면, 0~1사이의 값으로 변환된다.
- 왜 변환했는지 짐작이 갈것이다. Texture Coordinate가 0~1값이기 때문
- out_Color = texture(sampler2D변수, 곱한값); 을 하면, 가져온 Texture의 해당위치의 pixel을 출력할 수 있다.
이미지 처리를 구현해보자
Image Negative
- out_Color = vec4(1.0, 1.0, 1.0, 1.0) - texture(sampler, 곱한값);
- out_Color.a = 1.0; // 까지 하면, 좀 더 확실하죵
Image Blur
- textureOffset(sampler, 곱한값, ivec2(-1, 0)); // offset을 이용할 수 있다. (마치 알고리즘문제)
- 나 자신과 주변 4개의 픽셀값을 가져와서 1/5하면 된다.(평균)
Edge Detection
- adjacent Texel에 접근해야한다.
- Blur처럼 주변 픽셀값을 살펴보고 설정해둔 임계값의 범위를 넘어가면 테두리로 인식, 흰색을 출력
- 넘어가지 않으면 검은색 출력
Toon Rendering
- Edge Detection과 방법이 같되, 테두리가 아닌 경우 임계값에 한하여, 한가지색으로 통일
glReadPixels
- GPU가 만든 FrameBuffer의 값을 CPU가 읽어올 수 있는 함수가 있다.
- glReadPixels(시작w, 시작h, w, h, GL_RGB, GL_UNSIGNED_BYTE, rgb);
- 이것의 문제는, 앞에서 Bus에 대한 고민을 말했듯이 CPU와 GPU간의 이동이 많아지면 좋지않다.
- 대량의 데이터의 이동은 빠르지만 소량의 이동은 느려진다. 그러므로 꼭필요할때만 사용하자.
이미지처리의 사용
- 포토샵같은 이미지 보정 application
- 게임에서의 Post Processing(아주 유용. 게임의 분위기를 만드는데 이만한게 없더라)
- fly video
- augmented reality(AR)