산출 연산 함수
- 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 |
댓글