[OpenGL]Image Processing

후이재·2020년 10월 20일
2
post-thumbnail

갑자기 Image Processing?

  • 갑자기 이미지처리를 하냐 하면,, 다 이유가 있다.
  • 갑자기그러니까 갑자기 컴퓨터그래픽스 강의 첫시간인가.. 교수님이 영상처리와 컴퓨터그래픽스는 서로 다른 방향의 작업을 수행한다고 하셨던것이 생각난다.
  • 영상처리는 이미지에서 데이터를 뽑아 사용하고, 컴퓨터그래픽스는 데이터를 이용해서 이미지를 생성한다.
  • 그냥 생각났다.

Shader의 사용

  1. Drawing
  2. Rendering
  3. 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가 하는것이 옳은가 판단하기

  1. Image Processing이 data-parallel한가?(데이터 저장결과가 다른 점에 영향이 가지않는가?)
  2. bus traffic은 어떤가?(CPU와 GPU사이를 왔다갔다 하지않고 한번의 입력으로 처리가 가능한가?)
  3. 어떤 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)
profile
공부를 위한 벨로그

0개의 댓글