티스토리 뷰

  • 이 문서는 1.1 문서의 1.1.2에서 소개한 m*n*3으로 구성된 RGB format을 기준으로 다루었다. indexed image format에 대해서는 다른 방법을 써야할 수도 있다.(1.1문서: https://hezma.tistory.com/80)

1.4 매트랩에서 이미지의 RGB 추출하기

이번 목표는 매트랩의 컬러 영상에서

  • 주어진 사진을 불러와서 출력해보기
  • R G B 성분 각각을 추출해서 띄워보기
  • 원래의 이미지를 빨간 사진, 파란 사진, 초록 사진으로 분해하여 출력해보는 것이다.

즉 합쳐지면 원래의 사진이 되는 3개의 R G B 사진 띄우기가 목표다. 예제로써 다음 사진을 사용했다. 

<그림1: 예제로 사용한 Lena의 사진>

우선 같은 카테고리의 1.1과 1.2를 읽거나 매트랩에서 이미지가 어떤 구조로 되어있는지 알고 이 글을 읽기를 권한다.

1.1 매트랩의 이미지 구조: https://hezma.tistory.com/80

1.2 매트랩에서 이미지 불러오기, 출력하기: https://hezma.tistory.com/81

1.4.1 이미지 가져와서 imshow()로 출력

1.2에서 다루었듯이 이미지는 아래 <그림2>의 코드와 같이 가져오면 된다.

<그림2: 이미지를 가져와서 출력하는 코드>

그러면 출력은 다음<그림3>과 같이 나온다. 참고로 figure(n) 함수는 n번째 창을 띄우는 함수다.

<그림3: 출력 결과>

1.4.2 이미지의 RGB 성분 세기 출력

이제 1.2의 포스팅을 참고하면 불러온 img matrix에서

  • img(:,:,1)에는 영상의 R의 세기가
  • img(:,:,2)에는 영상의 G의 세기가
  • img(:,:,3)에는 영상의 B의 세기가

담겨있다는 것을 알 수 있다. 따라서 각각을 다음 <그림4>의 코드와 같이 추출해주면 된다.

<그림4: 코드>

코드에서 [row,col,X] =size(img)는 img의 row, col을 가져오기 위한 문장이다. 이 때 img는 3차원 matrix이기 때문에 반환 값이 총 3개이다. 따라서 어떤 변수 X를 넣어주거나 X대신 ~를 써줘야 한다. 그것을 안넣으면 밑과 같이 col이 좀 이상하게 나온다.

이렇게 row와 col을 가져오는건 밑의 코드를 위해서니까 일단 넘어가자

또한 imshow()함수는 2차원의 행렬을 흑백 영상으로 출력하므로 각각을 넣어주면 다음 <그림5>와 같은 출력 결과를 볼 수 있다.(3차원의 행렬은 RGB영상으로 출력한다) 참고로 subplot(3,1,m)은 3행 1열의 subplot을 만들고 m번째 원소에 띄우겠다는 뜻이다.

<그림5: 출력 결과>

각 R G B의 세기에 따라 흑백 사진의 밝기가 다른 것을 볼 수 있다.

1.4.3 이미지의 RGB성분을 빨강 초록 파랑 화면으로 분해하여 띄우기

그런데 아마 처음에 원하던 바는 이런 흑백 영상이 아니라 원래의 그림이 빨강, 초록, 파랑 화면으로 분리된 것을 원했을 것이다. 그러려면 1.4.2처럼 2차원 행렬을 imshow에 전달해주는 것이 아니라 3차원 행렬을 전해주어야 한다. 왜냐하면 imshow()는 2차원 행렬은 흑백, 3차원 행렬을 컬러로 출력하기 때문이다. 우리가 1.4.2에서 추출한 red, green, blue는 각 RGB성분의 세기를 추출한 2D matrix 이고 따라서 흑백 영상으로 출력되었다.

여기서 3차원 행렬의 컬러 이미지를 만들려면 조금만 생각해보면 된다. R성분만 추출하여 빨간색으로 출력하는 경우를 생각해보면 원래 영상에서 단순히 G와 B 성분이 모두 0으로 만들면 된다. 그러면 빨강 성분을 제외한 모든 성분이 0이 되었으므로 빨강 성분만 남은 컬러 사진이 출력된다. 가져온 img변수를 변형하는 것은 좋은 선택이 아니므로 1.4.2에서 이미 추출한 red, blue, green 변수를 가지고 다음과 <그림6>과 같이 코드를 써보면 된다.

 

<그림6: R G B 영상 코드>

그러면 결과는 다음 <그림7>과 같이 원하는 바가 나온다.

<그림7: RGB 분리 결과>

이 때 imshow함수 안에 들어가는 변수에 uint8()함수를 써준 것은 parameter의 형변환을 위해서인데 그것을 안쓰고 하면 다음 <그림8>과 같이 그냥 빨강, 초록, 파랑으로만 구성된 결과가 나온다.

<그림8: int형으로 변환하지 않았을 때>

# 왜 uint8을 이용해 int로의 형 변환을 하는지 궁금하면 게시글 1.1 매트랩의 이미지구조 글을 참고하기를 바란다.

1.1: https://hezma.tistory.com/80

- 간략하게 설명하면 matlab상에서 이미지의 밝기는 0~1 혹은 0~255등으로 표현되기 때문에 값의 scaling을 달리 해주어야 한다. 만약 int로 scaling되어있는 값(0~255로 표현된 이미지)인데 double형으로 넣으면 matlab상에서는 0~1내부의 값으로 밝기를 인식하기 때문에 위와 같이 max 밝기로 거의 가득찬 이미지가 나오게 된다.

 

댓글