* 학습내용
- openCV란?
- openCV 설치
- 이미지 출력
1. OpenCV란?
- Open Source Computer Vision Library
- 이미지 전처리하는 라이브러리. 포토샵의 프로그래밍 버전.
- 컴퓨터 비전을 목적으로 개발됨
- intel에서 개발하다가 open source됨
- os에 상관없이 동작 가능
- c/c++로 개발되었으나 python, JAVA, MATLAB의 개발 환경도 지원
- 실시간에 초점을 두고 나온 라이브러리이기 때문에 모바일 카메라나 로봇 등 영상처리에 활용됨
2. 설치
pip install opencv-contrib-python
3. 실습: 이미지 핸들링
1) 이미지 읽기
cv2.imread(읽어 올 이미지 파일경로,[, flag] )
- flag
- cv2.IMREAD_COLOR
- default.
- BGR이 기본값이므로 matplotlib에서 RGB 모드로 변경시켜줘야 함
- cv2.IMREAD_GRAYSACLE
- 사용 예시
import cv2 # image read 방법1 img_1 = cv2.imread('images/Lenna.png') # image read 방법2 img_2 = cv2.imread('images/Lenna.png', cv2.IMREAD_GRAYSCALE)
2) 이미지 출력: cv2 사용, matplotlib 사용
import cv2 import matplotlib.pyplot as plt lenna = cv2.imread("images/Lenna.png") # 이미지 출력 1- cv2 사용 # lenna라는 이름의 새창을 띄움 cv2.imshow('lenna', lenna) cv2.waitKey(0) cv2.destroyAllWindows() # 이미지 출력 2- matplotlib 사용 # matplotlib 사용하여 새창을 띄우지 않고 주피터 노트북에 이미지 출력 %matplotlib inline plt.figure(figsize=(10, 10)) # plt.imshow(lenna) # 또는 BGR -> RGB로 변경 출력 plt.imshow(lenna[:,:,::-1] plt.show()
3-1) 채널별로 회색모드로 출력
각 채널별 비교를 통해 원본이 어떤 색상이 제일 강하게 나타나는지 육안 확인 가능
import cv2 # 이미지 파일 read lenna = cv2.imread("images/Lenna.png") # 불러드린 이미지는 기본 BGR모드이므로 채널별 분할 blue, green, red = cv2.split(lenna) # 채널별 이미지 출력 plt.figure(figsize = (20, 20)) plt.subplot(2, 2, 1) plt.title("original", fontsize = 20) plt.imshow(lenna[:,:,::-1]) #lenna가 BGR -> RGB로 변환 후 출력 plt.axis('off') plt.subplot(2, 2, 2) plt.title("blue", fontsize = 20) plt.imshow(blue, cmap='gray') # gray 모드로 출력 plt.axis('off') plt.subplot(2, 2, 3) plt.title("green", fontsize = 20) plt.imshow(green, cmap='gray') plt.axis('off') plt.subplot(2, 2, 4) plt.title("red", fontsize = 20) plt.imshow(red, cmap='gray') plt.axis('off') plt.tight_layout() plt.show()

3-2) 각 채널별 히스토그램 그리기
육안으로 사진비교하기 보다 히스토그래프로 어느 채널에서 픽셀값이 어떻게 형성되어 있는지 확인하기 위한 작업
해당 작업을 통해 특정 색상을 빼는 작업도 가능
import cv2 import numpy as np import matplotlib.pyplot as plt # 이미지 read lenna = cv2.imread('images/Lenna.png') # 이미지 채널별 분류 bgr_channels = cv2.split(lenna) # 이미지 채널별 출력 color_label = ['blue', 'green', 'red'] plt.figure(figsize=(10,6)) for channel, color in zip(bgr_channels, color_label): hist = cv2.calcHist([channel], [0], None, [256], [0,256]) # 주석1) 참고 plt.plot(hist, color=color, label=color) plt.legend() plt.xlabel('Pixel value') plt.ylabel('Count') plt.show()

- 주석1)
hist = cv2.calcHist([대상 이미지명], # 히스토그램에 사용할 값을 계산할 대상 이미지
[0], # 히스토그램을 계산할 채널. 흑백이미지는 0으로 지정. 기본 BGR일 경우 0은 B, 1은 G, 2는 R
None, # mask - 전체 영상의 픽셀들의 빈도수를 구할 경우 None으로 지정.
[256], # bin의 개수(등급을 몇개로 나눌지)
[0,256] # 개수를 셀 픽셀값의 범위(0 ~ 255까지)
)
3-3) 특정 채널 색상 제거
import cv2 import numpy as np import matplotlib.pyplot as plt lenna = cv2.imread('images/Lenna.png') no_red = lenna.copy() # red 채널을 0으로 변경 no_red[:, :, 2] = 0 # 비교를 위해 원본과 red색을 뺀 이미지(no_red)출력 plt.figure(figsize=(10,7)) plt.subplot(1, 1, 1) plt.imshow(lenna[:, :, -1]) # 원본은 RGB배열인데, cv2.imread시 기본 BGR모드이므로 B채널과 R채널 변경 plt.axis('off') plt.subplot(1, 2, 2) plt.imshow(no_red[:,:, ::-1]) plt.axis('off') plt.tight_layout() plt.show()

'Edu > 07. OpenCV' 카테고리의 다른 글
| 이미지 색공간 변환: cvtColor (0) | 2021.08.27 |
|---|---|
| 기본영상처리: 명암대비(contrast) (0) | 2021.08.25 |
| 기본영상처리: 밝기 조절(brightness) (0) | 2021.08.25 |