본문 바로가기
Image Processing/OpenCV

[OpenCV] 기본 배열 연산 (Operations On Arrays)

by AteN 2022. 11. 19.

기본 배열 (Array) 처리 함수

  • cv2.filp(src, flipCode[, dst]) : 입력된 2차원 배열을 수직, 수평, 양축으로 뒤집는다
    • src, dst : 입력 배열, 출력 배열
    • filp code
      • 0 : x축을 기준으로 위아래로 뒤집는다
      • 1 : y축을 기준으로 좌우로 뒤집는다
      • -1 : 양축 (x축, y축)을 기준으로 뒤집느다
  • cv2.repeat(src, ny, nx[, dst]) : 입력 배열의 반복된 복사본으로 배열을 채운다
    • src, dst : 입력 배열, 출력 배열
    • ny, nx : 수직 방향, 수평 방향 반복 횟수
  • cv2.transpose(src[, dst]) : 입력 행렬의 전치 행렬을 출력으로 반환
    • src, dst : 입력 배열, 출력 배열
import cv2

image = cv2.imread("img/flip_test.jpg", cv2.IMREAD_COLOR)
if image is None: raise Exception("영상 파일 읽기 오류 발생") # 예외 처리

x_axis = cv2.flip(image, 0)                 # x축 기준 상하 뒤집기
y_axis = cv2.flip(image, 1)                 # y축 기준 좌우 뒤집기
xy_axis = cv2.flip(image, -1)
rep_image   = cv2.repeat(image, 1, 2)       # 반복 복사
trans_image = cv2.transpose(image)          # 행렬 전치

## 각 행렬을 영상으로 표시
titles = ['image', 'x_axis', 'y_axis','xy_axis','rep_image','trans_image']
for title in titles:
    cv2.imshow(title, eval(title))
cv2.waitKey(0)
 

 

채널 처리 함수

  • 컬러 영상은 파란색(B), 녹색(G), 빨간색(R) 각기 독립적인 2차원 정보를 합쳐 놓은 배열이라고 정의
  • 파이썬에서는 넘파이 배열에 영상정보를 담을 수 있으며, 일련의 3개 원소로 하나의 컬러 화소가 구성되며, 화소 단위로 순회한다.
  • 컬러 배열을 분리하면 각 채널을 단일 채널 행렬로 구성할 수 있으며, 세부적인 영상처리에 이용할 수 있다
  • cv2.merge(mv[, dst]): 여러 개의 단일 채널 배열을 다채널 배열로 합성한다
    • mv : 합성될 입력 배열 혹은 벡터, 합성될 단일 채널 배열들의 크기와 깊이가 동일해야 한다
    • dst : 입력 배열과 같은 크기와 같은 깊이의 출력 배열
  • cv2.split(m[, dst]): 다채널 배열을 여러 개의 단일 채널 배열로 분리한다
    • m : 입력되는 다채널 배열
    • mv : 분리되어 반환되는 단일 채널 배열들의 벡터
import numpy as np
import cv2
 
# numpy array이용해 단일 채널 3개 생성
ch0 = np.zeros((2, 4), np.uint8) + 10           # 0원소 행렬 선언 후 10 더하기
ch1 = np.ones((2, 4), np.uint8) * 20            # 1원소 행렬 선언 후 20 곱하기
ch2 = np.zeros((2, 4), np.uint8); ch2[:] = 30   # 0원소 행렬 선언 후 행렬원소값 30 지정
 
list_bgr = [ch0, ch1, ch2]                      # 단일 채널들을 모아 리스트 구성
merge_bgr = cv2.merge(list_bgr)                 # 채널 합성
split_bgr = cv2.split(merge_bgr)                # 채널 분리: 컬러영상--> 3채널 분리
 
print('split_bgr 행렬 형태 ', np.array(split_bgr).shape)
print('merge_bgr 행렬 형태', merge_bgr.shape)
split_bgr 행렬 형태  (3, 2, 4)
merge_bgr 행렬 형태 (2, 4, 3)
 
print("[ch0] = \n%s\n" % ch0)                     # 단일 채널 원소 출력
print("[ch1] = \n%s\n" % ch1)
print("[ch2] = \n%s" % ch2)
[ch0] = 
[[10 10 10 10]
 [10 10 10 10]]

[ch1] = 
[[20 20 20 20]
 [20 20 20 20]]

[ch2] = 
[[30 30 30 30]
 [30 30 30 30]]
 
print("[merge_bgr] = \n %s\n" % merge_bgr)       # 다중 채널 원소 출력
[merge_bgr] = 
 [[[10 20 30]
  [10 20 30]
  [10 20 30]
  [10 20 30]]

 [[10 20 30]
  [10 20 30]
  [10 20 30]
  [10 20 30]]]

 
print("[split_bgr[0]] =\n%s\n " % split_bgr[0])
print("[split_bgr[1]] =\n%s\n " % split_bgr[1])
print("[split_bgr[2]] =\n%s " % split_bgr[2])
[split_bgr[0]] =
[[10 10 10 10]
 [10 10 10 10]]
 
[split_bgr[1]] =
[[20 20 20 20]
 [20 20 20 20]]
 
[split_bgr[2]] =
[[30 30 30 30]
 [30 30 30 30]] 

컬러 채널 분리

import cv2
 
image = cv2.imread( "img/color.jpg", cv2.IMREAD_COLOR)   # 영상 읽기
if image is None: raise Exception("영상 파일 읽기 오류 발생")  # 예외 처리
if image.ndim != 3: raise Exception("컬러 영상 아님")
    
 
bgr = cv2.split(image)                      # 채널 분리: 컬러영상--> 3채널 분리
# blue, green, red = cv2.split(image)
 
print("bgr 자료형:",  type(bgr), type(bgr[0]), type(bgr[0][0][0]))
print("bgr 원소개수:", len(bgr))
bgr 자료형: <class 'list'> <class 'numpy.ndarray'> <class 'numpy.uint8'>
bgr 원소개수: 3
# 각 채널을 윈도우에 띄우기 
cv2.imshow("image", image)
cv2.imshow("Blue channel" , bgr[0])         # blue 채널
cv2.imshow("Green channel", bgr[1])         # green 채널
cv2.imshow("Red channel"  , bgr[2])         # red 채널
# cv2.imshow("Blue channel" , image[:,:,0])         	# 넘파이 객체 인덱싱
# cv2.imshow("Green channel", image[:,:,1])
# cv2.imshow("Red channel"  , image[:,:,2])
cv2.waitKey()
 
 

'Image Processing > OpenCV' 카테고리의 다른 글

[OpenCV] 01. 화소 처리  (0) 2022.11.22
[OpenCV] 산출 연산 함수  (0) 2022.11.21
[OpenCV] VideoCapture  (0) 2022.11.15
[OpenCV] I/O 처리  (0) 2022.11.10
[OpenCV] 사용자 인터페이스  (0) 2022.11.09

댓글