[컴퓨터 비전] 이미지 읽기 및 R,G,B 채널 분리하기

In9_9yu·2020년 9월 18일
1

컴퓨터 비전

목록 보기
1/2

목표 : 이미지를 읽고 RGB채널을 분리하기

1. 이미지 읽기

이미지를 읽는데 여러가지 방법이 있었는데, matplotlib를 이용해서 이미지를 읽도록 했다. 사용한 이미지는 다음과 같다.

import matplotlib.pyplot as plt

img = plt.imread("./berry.jpg")
print(img)
print(img.shape)

위 결과는 다음과 같다.

[[[229 219 210]  --> 화소 하나의 R,G,B 값
  [229 219 210]
  [229 219 210]
  ...
  [221 209 197]
  [221 209 197]
  [221 209 197]]

 [[229 219 210]
  [229 219 210]
  [229 219 210]
  ...
  
  (1363, 2048, 3)  --> height , width , channel

img.shape의 결과로 (1368,2048,3)의 결과가 나왔는데, 세로로 1363개의 화소 , 가로로 2048개의 화소가 있다는 뜻 이다. 결과적으로 사진에 포함된 총 화소의 개수는 2791424개가 된다.

2. RGB 채널 분리하기

이제 각 화소마다 R,G,B값을 구할 수 있으니, R은 R끼리 G는 G끼리 B는 B끼리 모아보도록 하자.

def split_channel (img):
    height,width,channels = img.shape
    red_pixels=[]
    green_pixels=[]
    blue_pixels=[]

    for h in range(height):
        tmp_red = []
        tmp_green = []
        tmp_blue = []
        for w in range(width):
            tmp_red.append(img[h][w][0])
            tmp_green.append(img[h][w][1])
            tmp_blue.append(img[h][w][2])
        red_pixels.append(tmp_red)
        green_pixels.append(tmp_green)
        blue_pixels.append(tmp_blue)

    return red_pixels,green_pixels,blue_pixels

for문을 이용해서 여차저차 만들긴 했는데, 모양이 너무 이쁘지 않았다. (아무래도 가로로 2048개라...) 그리고 매번 이렇게 작성해서 쓸 수 없으니까 opencv를 이용하기로 했다.

[설치]
pip3 install opencv-python

import cv2
	.
	.
	.

blue,green,red = cv2.split(img) (cv2.split은 BGR 순으로 나눈다)
print(red)

이렇게 입력하고 나면 다음과 같이 예쁘고 빠르게 다음과 같은 결과가 나온다.

#각 화소마다 가지고 있는 Red 값의 모음

[[229 229 229 ... 221 221 221]
 [229 229 229 ... 221 221 221]
 [229 229 229 ... 221 221 221]
 ...
 [246 246 246 ... 245 245 245]
 [246 246 246 ... 245 245 245]
 [246 246 246 ... 245 245 245]]

이렇게 하면 RGB 채널을 간단하게 분리 할 수 있다.
오늘의 목표 달성

profile
FE 임니다

1개의 댓글

comment-user-thumbnail
2021년 6월 28일

open cv로 구현 한 코드 전체를 보여주실 수 있나요?

답글 달기