갈루아의 반서재

색상공간은 이미지를 저장하는 다양한 형태를 의미하는 용어로, 흔히 접하는 그레이스케일, RGB, CMYK 등이 이에 해당한다. 그리고 색상공간의 각 값을 색상채널이라고 부른다. 


그레이스케일

이미지의 각 픽셀 값은 0 (검은색) ~255 (흰색) 사이의 값을 가진다. 엄밀히 말해서 흑백이미지와는 다르다. 흑백 이미지에서 각 픽셀은 0 혹은 255 만을 가지며 그 사이에는 값이 없다.


RGB

빨간, 녹색, 파란색 채널의 3가지 값의 조합으로 나타낸다. 

  • 검은색 = (0, 0, 0)
  • 빨간색 = (255, 0, 0)
  • 녹색 = (0, 255, 0)
  • 파란색 = (0, 0, 255)
  • 흰색 = (255, 255, 255)


HSV 

색조hue, 채도saturation, 값value

RGB 값을 원통에 투영하는 원통형 좌표계. 

https://en.wikipedia.org/wiki/HSL_and_HSV#/media/File:HSV_color_solid_cylinder_saturation_gray.png


이미지는 2D 행렬은 저장된다. 이미지는 각 채널 수만큼 여러 개의 2D 행렬을 갖는다. 다음은 RGB 이미지와 그레이스케일 이미지의 픽셀 값을 출력하는 코드다.

img.getpixel((300,300))
Out[5]:
(104, 101, 100)

convert() 를 이용하여 색상공간(mode)를 변경할 수 있다. 그레이스케일을 나타내는  “L” (luminance) 과 트루 컬러 이미지를 나타내는 "RGB" 사이의 변환이 가능하다. 

img.convert("L").getpixel((300,300))
Out[6]:
101

그리고 다음과 같이 이미지 객체의 속성을 확인할 수 있다. 먼저 format 속성은 이미지 소스를 확인해주는 것으로 만약 파일로부터 이미지를 불러올 수 없으면 None, 그리고 파일을 열 수 없으면 IOError exception 을 반환한다. 그리고 size 속성은 2-튜플로 너비와 높이를 가진다. 그리고 mode 는 그레이스케일 이미지의 경우 “L” (luminance), 트루 컬러 이미지의 경우 “RGB”, 그리고 pre-press 이미지의 경우 “CMYK” 값을 반환한다.

print(img.format, img.size, img.mode)
PNG (2000, 1198) RGB


이미지 깊이

픽셀의 값을 나타내는 데 사용되는 비트수로, 예를 들어 8비트의 경우 0 에서 255 까지의 값을 갖는다. 2의 8승 총 256개의 값을 가진다.


아래는 컬러 이미지를 그레이스케일로 변환하는 방법이다.

grayscale_img = img.convert("L")
imshow(np.asarray(grayscale_img)) 
Out[9]:
<matplotlib.image.AxesImage at 0x7fab37a45320>