OpenCV

·2023년 10월 27일

인공지능

목록 보기
9/19

OpenCV 환경설정(colab)

# 구글 드라이브 사용 권한 설정
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)

1

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

  • cv2.imread(filename[, flags])
  • filename : 읽어들일 이미지 파일의 이름입니다. 상대 경로나 절대 경로를 포함할 수 있습니다.
  • flags : 선택적 매개변수로, 이미지 파일을 읽는 방식을 지정합니다. 기본값은 cv2.IMREAD_COLOR입니다.

2

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로 변환하여 출력

3

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)

#결과:

4

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

#결과:

5

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

#결과:

6

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

#결과:

7

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

8

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 함수들이나 저장 등에서 사용될 수 있습니다.

profile
공부 기록

0개의 댓글