인프런 커뮤니티 질문&답변

하키빌리지님의 프로필 이미지
하키빌리지

작성한 질문수

[개정판] 딥러닝 컴퓨터 비전 완벽 가이드

OpenCV를 활용한 이미지 처리 실습

채널 별 출력 결과가 같은 이유

작성

·

483

1

안녕하세요 항상 답변 감사드립니다.

RGB를  img[ :, : ,0], img[ :, : , 1], img[:, :, 2] 로 나눠서 출력하면 각 각 R, G, B 위주로 다른 색으로 출력될거라 생각했는데 출력 이미지는 원본과 다르지만 셋이 서로 같더라구요. 왜 그런지 궁금합니다.

답변 7

0

권 철민님의 프로필 이미지
권 철민
지식공유자

도움이 되었다니 저도 기쁩니다. ^^

0

제가 일부분만 출력해서 비교했네요.. 강사님 덕분에 의문이 싹 풀렸습니다.

항상 감사드립니다!

0

권 철민님의 프로필 이미지
권 철민
지식공유자

실제로 올려주신 결과 코드를 돌려보면 이미지 색깔값이 약간씩 다릅니다.  아래 코드를 수행해 보시면 개별 이미지가 default color map기반에서 색깔의 진함이 조금씩 다릅니다.

import numpy as np
import matplotlib.cm as cm

figure, axs = plt.subplots(figsize=(1812), ncols=4, nrows=1)

img_rgb = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
print('img_rgb shape:', img_rgb.shape)
print('img_rgb[:,:,0] shape:', img_rgb[:,:,0].shape)
print('img_rgb[:,:,0] shape:', img_rgb[:,:,1].shape)
print('img_rgb[:,:,0] shape:', img_rgb[:,:,2].shape)

axs[0].imshow(img_rgb[:,:,:])
axs[1].imshow(img_rgb[:,:,0])
axs[2].imshow(img_rgb[:,:,1])
axs[3].imshow(img_rgb[:,:,2])

0

안녕하세요 답변 감사드립니다.

하나만 더 여쭙고 싶습니다. 

2차원 행렬이 되어서 일괄적으로 color map 을 설정한다는 부분까지는 이해가 됐습니다만,

채널별로 같은 행, 열 끼리 서로 값이 다를텐데 일괄적인 color map을 적용한다면 결과는 채널별로 비슷하지만 달라야 한다고 생각됩니다.

예를 들자면 0 번째 채널의 1행 1열의 값이 10 이라면 옅은 하늘색이지만 1번째 채널의 1행 1열의 값은 70 이라 진한 파랑색으로 출력되어야 한다고 생각했는데 실제 결과는 둘이 같습니다.

제가 무엇을 놓치고 있는지 궁금합니다.

항상 빠르고 친절한 답변 감사드립니다. (꾸벅)

0

권 철민님의 프로필 이미지
권 철민
지식공유자

img_rgb[:,:,0]과 같은 처리를 하는 순간에 img_rgb는 3차원 행렬이 아니라 2차원 행렬이 되어 버립니다.

2차원 행렬의 경우에는 matplotlib이 어떤 컬러값을 기준으로 이미지를 표현해야 할지 몰라서 일괄적으로 Color map을  설정해버려서 그렇게 출력이 됩니다. 따라서 2차원 행렬로 표시가 될때는 색깔에 color map 값이 maptlotlib에 주어져야 합니다.  아래 코드로 실행해 보십시요. 

import numpy as np
import matplotlib.cm as cm

figure, axs = plt.subplots(figsize=(1812), ncols=4, nrows=1)

img_rgb = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
print('img_rgb shape:', img_rgb.shape)
print('img_rgb[:,:,0] shape:', img_rgb[:,:,0].shape)
print('img_rgb[:,:,0] shape:', img_rgb[:,:,1].shape)
print('img_rgb[:,:,0] shape:', img_rgb[:,:,2].shape)

axs[0].imshow(img_rgb[:,:,:])
axs[1].imshow(img_rgb[:,:,0], cmap=cm.Reds)
axs[2].imshow(img_rgb[:,:,1], cmap=cm.Greens)
axs[3].imshow(img_rgb[:,:,2], cmap=cm.Blues)

0

안녕하세요 소스코드는 아래와 같습니다.
import cv2
import matplotlib.pyplot as plt
import os
%matplotlib inline

# 코랩 버전은 상대 경로를 사용하지 않습니다. /content 디렉토리를 기준으로 절대 경로를 이용합니다.
# default_dir 은 /content/DLCV로 지정하고 os.path.join()으로 상세 파일/디렉토리를 지정합니다.
default_dir = '/content/DLCV'
img = cv2.imread(os.path.join(default_dir, 'data/voc/VOCdevkit/VOC2012/JPEGImages/2007_000032.jpg'))
img_rgb = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
print('img shape:', img.shape)

plt.figure(figsize=(8, 8))
plt.imshow(img_rgb[:,:,0]) #<---- 여기 입니다.
plt.show()
이렇게 했더니 초록, 파랑색 위주로 사진이 보여졌는데
0 : R, 1 : G, 2: B 해서 각 채널별 색상 위주로 보여질 줄 알았는데
img_rgb[:,:,0], img_rgb[:,:,1], img_rgb[:,:,2] 모두 같은 색상으로 출력되더라구요
1) 왜 같은 결과로 출력되는지 모르겠습니다.
2) 출력된 결과가 왜 초록, 파랑색 위주로 보여지는지 모르겠습니다.

0

권 철민님의 프로필 이미지
권 철민
지식공유자

안녕하십니까,

어느 실습 코드에서 어떻게 테스트 되었는지 알수 있을 까요? 작성하신 소스코드를 여기에 올려주시고, 어디가 이슈인지 말씀 부탁드립니다.

감사합니다.

하키빌리지님의 프로필 이미지
하키빌리지

작성한 질문수

질문하기