# 구글 드라이브 사용 권한 설정
from google.colab import drive
drive.mount('/content/gdrive/')
import os
colab_path = "/content/drive/MyDrive/******"
# OpenCV 패키지 사용
!pip install opencv-python
import cv2
from google.colab.patches import cv2_imshow # colab 용 cv2.imshow
#결과:
Requirement already satisfied: opencv-python in /usr/local/lib/python3.10/dist-packages (4.8.0.76)
Requirement already satisfied: numpy>=1.21.2 in /usr/local/lib/python3.10/dist-packages (from opencv-python) (1.23.5)
img = cv2.imread(os.path.join(colab_path, 'lena_color_512.png'), cv2.IMREAD_COLOR) # 기본 BGR 채널로 이미지 읽기
print(img.shape) # numpy ndarray: (행, 열, 채널)
print(img.size) # 행 * 열 * 채널
print(img.dtype) # uint8: 정수형 [0, 255]
#결과:
(512, 512, 3)
786432
uint8
plt.imshow(img)
#결과:

OpenCV는 이미지를 읽을 때 기본적으로 BGR (Blue-Green-Red) 순서로 채널을 처리합니다. 반면에, Matplotlib는 RGB (Red-Green-Blue) 순서를 사용하여 이미지를 표시합니다.
이 문제를 해결하기 위해서는 OpenCV에서 읽은 이미지의 BGR 채널 순서를 RGB 순서로 변환해주어야 합니다.
ex)
img_rgb = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
plt.imshow(img_rgb)
or
plt.imshow(img, cmap='gray') ## grayscale로 변환하여 출력
img_rgb = cv2.cvtColor(img, cv2.COLOR_BGR2RGB) # 색공간변환: BGR -> RGB
# img_rgb = img[:, :, [2, 1, 0]] # BGR -> RGB
# cv2_imshow(img_rgb)
plt.imshow(img_rgb)
#결과:

img_ycrcb = cv2.cvtColor(img, cv2.COLOR_BGR2YCrCb) # 색공간변환: BGR -> YCrCb
img_y = img_ycrcb[:, :, 0] # Y 채널 추출
plt.imshow(img_y, cmap='gray') # grayscale로 plot
#결과:

img_cr = img_ycrcb[:, :, 1] # Cr 채널 추출
plt.imshow(img_cr, cmap='gray') # grayscale로 plot
#결과:

img_cb = img_ycrcb[:, :, 2] # Cb 채널 추출
plt.imshow(img_cb, cmap='gray') # grayscale로 plot
#결과:

img_gray = cv2.imread(os.path.join(colab_path, 'lena_color_512.png'), cv2.IMREAD_GRAYSCALE) # grayscale로 파일 읽기
print(img_gray.shape) # grayscale 1채널
print(img_gray.size) # 행 * 열 * 채널
print(img_gray.dtype) # uint8: 정수형 [0, 255]
#결과:
(512, 512)
262144
uint8
img_rgb_crop = img_rgb[105:250,130:230, :] # 얼굴 절삭
plt.imshow(img_rgb_crop)
img_bgr_crop = img_rgb_crop[:,:,[2,1,0]]
cv2.imwrite(os.path.join(colab_path, 'lena_face.png'), img_bgr_crop) # png 파일 저장
#결과:

img_rgb_crop[:,:,[2,1,0]] 코드는 NumPy 배열의 인덱싱 기능을 사용하여 RGB 채널 순서를 다시 BGR로 변경하는 역할을 합니다.
:: 이 부분은 모든 행과 모든 열에 대해 작업을 수행하겠다는 의미입니다. 첫 번째 :는 모든 행을, 두 번째 :는 모든 열을 의미합니다.
[2,1,0]: 이 부분은 채널의 순서를 지정합니다. 원래 RGB 이미지에서 R은 0번 채널, G는 1번 채널, B는 2번 채널입니다. [2,1,0]으로 지정함으로써 RGB를 BGR로 변경하게 됩니다.
따라서 img_rgb_crop[:,:,[2,1,0]] 전체 코드의 동작은 원본 이미지 (img_rgb_crop)의 모든 픽셀에 대해 (모든 행과 열에 대해) R,G,B 색상 채널 순서를 B,G,R로 바꾸어 주어 OpenCV와 호환되도록 합니다.
이렇게 변환된 결과가 img_bgr_crop에 저장되며 이후 OpenCV 함수들이나 저장 등에서 사용될 수 있습니다.