본문 바로가기
Image Processing/OpenCV

[OpenCV] 산출 연산 함수

by AteN 2022. 11. 21.

산출 연산 함수

  • cv2.add(src1, src2[, dst[, mask[, dtype]]]) : 두 개의 배열 혹은 배열과 스칼라의 각 원소 간 합을 계산
    • src1 : 첫 번째 입력 배열 혹은 스칼라
    • src2 : 두 번째 입력 배열 혹은 스칼라
    • dst : 계산된 결과의 출력 배열
    • mask : 연산 마스크 : 0이 아닌 마스크 원소의 위치만 연산 수행(8비트 단일 채널)
    • dtype : 출력 배열의 깊이
  • cv2.subtract(src1, src2[, dst[, mask[, dtype]]]) : 두 개의 배열 혹은 배열과 스칼라의 각 원소 간 차분을 계산한다.
    • add() 함수와 인수 동일
  • cv2.multiply(src1, src2[, dst[, scale[, dtype]]]) : 두 배열의 각 원소 간 곱을 계산
    • scale : 두 배열의 원소 간 곱할 때 추가로 곱해주는 배율
  • cv2.divide(src1, src2[, dst[, scale[, dtype]]]) : 두 배열의 각 원소 간 나눗셈을 수행
  • cv2.divide(scale, src2[, dst[, dtype]]) : 스칼라값과 행렬 원소 간 나눗셈을 수행
  • cv2.addWeighted(src1, alpha, src2, beta, gamma[, dst[, dtype]]) : 두 배열의 각 원소에 가중치를 곱한 후에 가중된(weighted) 합을 계산
    • alpha : 첫 번째 배열의 모든 원소에 대한 가충치
    • beta : 두 번째 배열의 모든 원소에 대한 가충치
    • gamma : 두 배열의 원소 간 합에 추가로 더해주는 스칼라
import numpy as np, cv2
 
m1 = np.full((3, 6), 10, np.uint8)			# 단일 채널 생성 및 초기화
m2 = np.full((3, 6), 50, np.uint8)
m_mask = np.zeros(m1.shape, np.uint8)		# 마스크 생성
m_mask[ :, 3: ] = 1 
 
m_add1 = cv2.add(m1, m2)                    # 행렬 덧셈
m_add2 = cv2.add(m1, m2, mask=m_mask)       # 관심 영역만 덧셈 수행
 
# 행렬 나눗셈 수행
m_div1 = cv2.divide(m1, m2)
m1 = m1.astype(np.float32)                  # 형변환 - 소수 부분 보존
m2 = np.float32(m2)
m_div2 = cv2.divide(m1, m2)
titles = ['m1', 'm2', 'm_mask','m_add1','m_add2','m_div1', 'm_div2']
for title in titles:
    print("[%s] = \n%s \n" % (title, eval(title)))
[m1] = 
[[10. 10. 10. 10. 10. 10.]
 [10. 10. 10. 10. 10. 10.]
 [10. 10. 10. 10. 10. 10.]] 

[m2] = 
[[50. 50. 50. 50. 50. 50.]
 [50. 50. 50. 50. 50. 50.]
 [50. 50. 50. 50. 50. 50.]] 

[m_mask] = 
[[0 0 0 1 1 1]
 [0 0 0 1 1 1]
 [0 0 0 1 1 1]] 

[m_add1] = 
[[60 60 60 60 60 60]
 [60 60 60 60 60 60]
 [60 60 60 60 60 60]] 

[m_add2] = 
[[ 0  0  0 60 60 60]
 [ 0  0  0 60 60 60]
 [ 0  0  0 60 60 60]] 

[m_div1] = 
[[0 0 0 0 0 0]
 [0 0 0 0 0 0]
 [0 0 0 0 0 0]] 

[m_div2] = 
[[0.2 0.2 0.2 0.2 0.2 0.2]
 [0.2 0.2 0.2 0.2 0.2 0.2]
 [0.2 0.2 0.2 0.2 0.2 0.2]]

행렬 지수 및 로그 연산

  • cv2.exp(src[, dst]) : 모든 배열 원소의 지수(exponent)를 계산
    • src, dst : 입력 배열, 입력 배열과 같은 크기와 타입의 출력 배열
  • cv2.log(src[, dst]) : 모든 배열 원소의 접대값에 대한 자연 로그를 계산
  • cv2.sqrt(src[, dst]) : 모든 배열 원소의 대해 제곱근을 계산
  • cv2.pow(src, power[, dst]) : 모든 배열 원소에 대해 제곱 승수를 계산
    • power : 제곱 승수
  • cv2.magnitude(x, y[, magnitude]) : 2차원 배열들의 크기를 계산
    • x, y : x, y 좌표들의 입력 배열
    • magnitude : 입력 배열과 같은 크기의 출력 배열
  • cv2.phase(x, y[, angle[, angleInDegrees]]) : 2차원 배열의 회전 각도를 계산
    • angle : 각도들의 출력 배열
    • angleInDegrees : True (각을 degree(도)로 측정), False (각을 라디안(redian)으로 측정)
  • cv2.cartToPolar(x, y[, magnitude[, angle[, angleInDegrees]]]) : 2차원 배열들의 크기와 각도를 계산
  • cv2.polarToCart(magnitude, angle[, x[, y[, angleInDegrees]]]) : 각도와 크기로부터 2차원 배열들의 좌표를 계산
import numpy as np, cv2
 
# numpy array 생성 예시
v1 = np.array([1, 2, 3], np.float32)          # 1차원 리스트로 생성- 행벡터
v2 = np.array([[1], [2], [3]], np.float32)      # 2차원 리스트로(3행, 1열) - 행벡터
v3 = np.array([[1, 2, 3]], np.float32)        	# 2차원 리스트로(1행, 3열) - 일반 행렬
 
# OpenCV 산술 연산 함수는 numpy array만 가능함
v1_exp = cv2.exp(v1)                             # 벡터에 대한
v2_exp = cv2.exp(v2)                             # 행렬에 대한 지수 계산
v3_exp = cv2.exp(v3)                             # 행렬에 대한 지수 계산
log = cv2.log(v1)                             # 로그 계산
sqrt= cv2.sqrt(v2)                            # 제곱근 계산
pow = cv2.pow(v3, 3)                          # 3의 거듭제곱 계산
 
# 결과 출력
print("[v1] 형태: %s 원소: %s" % ( v1.shape, v1))
print("[v2] 형태: %s 원소:\n%s" % ( v2.shape, v2))
print("[v3] 형태: %s 원소: %s" % ( v3.shape, v3))
[v1] 형태: (3,) 원소: [1. 2. 3.]
[v2] 형태: (3, 1) 원소:
[[1.]
 [2.]
 [3.]]
[v3] 형태: (1, 3) 원소: [[1. 2. 3.]]
 
# 행렬 정보 출력 - OpenCV 결과는 행렬로 반환됨 - 행벡터는 열벡터로 반환됨
print("[v1_exp] 자료형: %s 형태: %s" % ( type(v1_exp), v1_exp.shape))  # 행벡터 인수의 결과
print("[v2_exp] 자료형: %s 형태: %s" % ( type(v2_exp), v2_exp.shape))  # 행벡터 인수의 결과
print("[v3_exp] 자료형: %s 형태: %s" % ( type(v3_exp), v3_exp.shape))  # 행벡터 인수의 결과
[v1_exp] 자료형: <class 'numpy.ndarray'> 형태: (3, 1)
[v2_exp] 자료형: <class 'numpy.ndarray'> 형태: (3, 1)
[v3_exp] 자료형: <class 'numpy.ndarray'> 형태: (1, 3)
 
# 열벡터를 1 행에 출력하는 예시 - 행벡터로 변환
print("[log] =", log.T)
print("[sqrt] =", np.ravel(sqrt))         
print("[pow] =", pow.flatten())
[log] = [[0.        0.6931472 1.0986123]]
[sqrt] = [1.        1.4142135 1.7320508]
[pow] = [ 1.  8. 27.]

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

[OpenCV] 02. 화소처리 (히스토그램)  (0) 2022.11.23
[OpenCV] 01. 화소 처리  (0) 2022.11.22
[OpenCV] 기본 배열 연산 (Operations On Arrays)  (0) 2022.11.19
[OpenCV] VideoCapture  (0) 2022.11.15
[OpenCV] I/O 처리  (0) 2022.11.10

댓글