황선규 박사님의 OpenCV 강의를 공부하면서 정리하였습니다.
영상의 산술 연산
OpenCV에서 제공하는 산술 연산 함수에 대해서 알아보겠습니다.
1. 덧셈 연산 - cv2.add
두 영상의 같은 위치에 존재하는 픽셀 값을 더하여 결과 영상의 픽셀 값으로 설정합니다.
덧셈 결과가 255보다 크면 픽셀 값을 255로 설정하는 saturate 기능이 적용되어 있습니다.
[함수 설명]
cv2.add(src1, src2, dst=None, mask=None, dtype=None) -> dst
• src1: (입력) 첫 번째 영상 또는 스칼라
• src2: (입력) 두 번째 영상 또는 스칼라
• dst: (출력) 덧셈 연산의 결과 영상
• mask: 마스크 영상
• dtype: 출력 영상(dst)의 타입. (e.g.) cv2.CV_8U, cv2.CV_32F 등 (cv 자료형 타입으로 입력)
[참고 사항]
▪ 스칼라(Scalar)는 실수 값 하나(그레이스케일) 또는 실수 값 네개로 구성된 튜플입니다.
▪ dst를 함수 인자로 전달하려면 dst의 크기가 src1, src2와 같아야 하며, 타입이 적절해야 합니다.
2. 가중치 합, 평균 연산 - cv2.addWeighted
덧셈 연산을 할 시에 많은 부분이 흰색으로 나옵니다.
두 영상의 같은 위치에 존재하는 픽셀 값에 대하여 가중합을 계산하여 결과 영상의 픽셀 값으로 설정합니다.
각각의 영상에 가중치를 곱하여 더해주면 두 입력 영상의 평균 밝기를 유지할 수 있습니다.
[함수 설명]
cv2.addWeighted(src1, alpha, src2, beta, gamma, dst=None, dtype=None) -> dst
• src1: (입력) 첫 번째 영상
• alpha: 첫 번째 영상 가중치
• src2: 두 번째 영상. src1과 같은 크기 & 같은 타입
• beta: 두 번째 영상 가중치
• gamma: 결과 영상에 추가적으로 더할 값
• dst: 가중치 합 결과 영상
• dtype: 출력 영상(dst)의 타입
3. 뺄셈 연산 - cv2.subtract
두 영상의 같은 위치에 존재하는 픽셀 값에 대하여 뺄셈 연산을 수행하여 결과 영상의 픽셀 값으로 설정합니다.
뺄셈 결과가 0보다 작으면 픽셀 값을 0으로 설정합니다. (saturate 연산)
[함수 설명]
sv2.subtract(src1, src2, dst=None, mask=None, dtype=None) -> dst
• src1: (입력) 첫 번째 영상 또는 스칼라
• src2: (입력) 두 번째 영상 또는 스칼라
• dst: (출력) 뺄셈 연산의 결과 영상
• mask : 마스크 영상
• dtype : 출력 영상(dst)의 타입
4. 차이 연산 cv2.absdiff
두 영상의 같은 위치에 존재하는 픽셀 값에 대하여 뺄셈 연산을 수행한 후, 그 절댓값을 결과 영상의 픽셀 값으로 설정합니다.
뺄셈 연산과 달리 입력 영상의 순서에 영향을 받지 않습니다.
두 영상의 차이점을 파악하기 위해 사용됩니다.
[함수 설명]
cv2.absdiff(src1, src2, dst=None) -> dst
• src1: (입력) 첫 번째 영상 또는 스칼라
• src2: (입력) 두 번째 영상 또는 스칼라
• dst: (출력) 차이 연산의 결과 영상
5. 예제 코드
위에서 서술한 4가지 연산을 코드로 확인해보겠습니다.
# 영상 불러오기
src1 = cv2.imread('lenna256.bmp', cv2.IMREAD_GRAYSCALE)
src2 = cv2.imread('square.bmp', cv2.IMREAD_GRAYSCALE)
# 불러왔는지 확인
if src1 is None or src2 is None:
print('Image load fauled!')
sys.exit()
# 4가지 연산
dst1 = cv2.add(src1, src2, dtype=cv2.CV_8U)
dst2 = cv2.addWeighted(src1, 0.5, src2, 0.5, 0.0)
dst3 = cv2.subtract(src1, src2)
dst4 = cv2.absdiff(src1, src2)
# 영상 출력
plt.subplot(231), plt.axis('off'), plt.imshow(src1, 'gray'), plt.title('src1')
plt.subplot(232), plt.axis('off'), plt.imshow(src2, 'gray'), plt.title('src2')
plt.subplot(233), plt.axis('off'), plt.imshow(dst1, 'gray'), plt.title('add')
plt.subplot(234), plt.axis('off'), plt.imshow(dst2, 'gray'), plt.title('addWeighted')
plt.subplot(235), plt.axis('off'), plt.imshow(dst3, 'gray'), plt.title('subtract')
plt.subplot(236), plt.axis('off'), plt.imshow(dst4, 'gray'), plt.title('absdiff')
plt.show()
6. 영산의 논리 연산 - cv2.bitwise
OpenCV에서 제공하는 논리연산도 확인해보겠습니다.
[함수 설명]
비트단위 AND, OR, XOR, NOT연산
cv2.bitwise_and(src1, src2, dst=None, mask=None) -> dst
cv2.bitwise_or(src1, src2, dst=None, mask=None) -> dst
cv2.bitwise_xor(src1, src2, dst=None, mask=None) -> dst
cv2.bitwise_not(src1, dst=None, mask=None) -> dst
• src1: 첫 번째 영상 또는 스칼라
• src2: 두 번째 영상 또는 스칼라
• dst: 출력 영상
• mask: 마스크 영상
[참고 사항]
각각의 픽셀 값을 이진수로 표현하고, 비트(bit) 단위 논리 연산을 수행합니다.
'Python > 파이썬 OpenCV 공부' 카테고리의 다른 글
[파이썬 OpenCV] 영상의 히스토그램 분석하기 - cv2.calcHist (0) | 2020.09.28 |
---|---|
[파이썬 OpenCV] 컬러 영상과 색 공간 - 색상 분리(cv2.split), 색상 결합(cv2.merge), 색 변환(cv2.cvtColor) (0) | 2020.09.27 |
[파이썬 OpenCV] 영상의 밝기 조절 - cv2.add, np.clip (0) | 2020.09.27 |
[파이썬 OpenCV] 동영상 전환 이펙트, 디졸브(dissolve)효과 (1) | 2020.09.27 |
[파이썬 OpenCV] 연산 시간 측정 방법 - cv2.TickMeter (0) | 2020.09.27 |