목표 : 이미지를 읽고 RGB채널을 분리하기
이미지를 읽는데 여러가지 방법이 있었는데, 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개가 된다.
이제 각 화소마다 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 채널을 간단하게 분리 할 수 있다.
오늘의 목표 달성
open cv로 구현 한 코드 전체를 보여주실 수 있나요?