OPEN CV - 3채널 영상의 Pixel 데이터 접근 방법

madpotato1713·2020년 1월 1일
0

컴퓨터 비전

목록 보기
2/3

OPEN CV에서 1채널 영상 픽셀 접근하기

다음 기회에 포스팅한다고 했는데, 마침 공부하는 도서에서 3채널 영상(컬러 영상)의 픽셀 접근에 관한 내용을 다루길래 포스팅한다(귀찮지 않다!!😗)

3채널 영상의 픽셀 접근에서 가장 중요한것을 짚고가자.

위의 그림은 3채널 3x3 이미지를 나타낸다. 하지만 데이터는? 27개가 들어있다.
그렇다. 한 좌표에 BGR 순서로 3개씩의 uchar 자료형의 데이터를 가지고 있는 것이다.

여기서 1채널과의 차이가 발생한다.
코드를 보면서 살펴보자.

1. Mat::at 사용

다양한 방법이 가능하지만, 위 코드가 가장 직관적인 것 같다.
참고로, Vec3b는 Vec<uchar, 3>이다. src.at(y, x)은 (y, x)좌표에 있는 픽셀의 B, G, R 데이터를 반환한다.
따라서, 위 코드상으로 p1[0], p1[1], p1[2]는 순서대로 B, G, R 데이터를 담고 있는 것이다.

위 for문 안의 코드는 간단히 dst.at<Vec3b>(y, x) = Vec3b(255, 255, 255) - src.at<Vec3b>(y, x); 와 같이 표현 가능하다.

2. Mat::ptr 사용

1번과 마찬가지이다. 다만 y열의 주소값을 받아서 차례로 집어넣어주는 차이가 있겠다. 1번에 비해 성능도 더 높다는것도 중요한 차이이다.
위 2중 for문 안의 코드는 p2[x] = Vec3b(255, 255, 255) - p1[x];와 같이 간단히 표현할 수 있다.

3. Mat::data 사용

3번 방법이 가장 이질적인 방법이 아닐까 한다.
하지만 개인적으로 익숙해지기만 한다면 이 방법이 제일 적응하기가 쉽지 않나 한다.

위 그림을 보자. 언급했듯이, 3번 방법을 사용할 때에는 1차원으로 데이터가 나열되있다고 생각하면 된다. 따라서, 반복문 안에서 1번부터 27번까지 순회할 수 있도록 for문을 구성하면 된다.
int index를 어떻게 만들었는지 잘 보면 이해가 빠를 것이다.

마치며

이상으로 3채널 영상의 Pixel 데이터 접근에 대하여 알아보았다.
필자 또한 이제 막 공부하는 입장이라, 아직 갈 길이 멀다.
차차 배워가면서 영상처리 알고리즘이나 수학적 내용도 다뤄보도록 하겠다.

profile
개발자 성장일기

0개의 댓글