영상의 산술 및 논리 연산

매일 공부(ML)·2021년 11월 11일
0

OPEN CV

목록 보기
8/45

덧셈 연산

  • 두 영상의 같은 위치에 존재하는 픽셀 값을 더한 값을 설정

  • 덧셈 결과 > 255 -> 픽셀 값 =255( 포화연산, 흰색)

cv2.add(src1, src2, dst=None, mask=None, dtype=None) -> dst
  • src1 : (입력) 첫 번째 영상 또는 스칼라
  • src2 : (입력) 두 번째 영상 또는 스칼라
  • dst : (출력) 덧셈 연산의 결과 영상
  • mask : 마스크 영상
  • dtype : 출력 영상(dst)의 타입. ex. cv2.CV_8U, cv2.CV_32F 등

*참고사항

  • 스칼라(scalar)는 실수 값 하나 또는 실수 값 네 개로 구성된 튜플
  • dst를 함수 인자로 전달하려면 dst의 크기가 src1, src2와 같아야 하며, 타입이 적절해야 한다.

가중치 합(weighted sum)

  • 두 영상의 같은 위치에 존재하는 픽셀 값에 대하여 가중합을 계산하여 결과 영상의 픽셀 값

  • α + β = 1이 되도록 설정 -> 두 입력 영상의 평균 밝기를 유지

평균 연산(average)

  • 가중치를 α = β = 0.5 로 설정한 가중치 합

  • EX)

cv2.addWeighted(src1, alpha, src2, beta, gamma, dst=None, dtype = None) -> dst
  • src1 : 첫 번째 영상
  • alpha : 첫 번째 영상 가중치
  • src2 : 두 번째 영상. src1과 같은 크기 & 영상 타입.
  • beta : 두 번째 영상 가중치
  • gamma : 결과 영상에 추가적으로 더할 값
  • dst : 가중치 합 결과 영상
  • dtype : 출력 영상(dst)의 타입

뺄셈 연산

  • 두 영상의 같은 위치에 존재하는 픽셀 값에 대하여 뺄셈 연산을 수행하여 픽셀 값

  • 뺄셈 결과 < 0, 픽셀 값= 0 (포화 연산,검은색)

cv2.substract(src1, src2, dst=None, mask=None, dtype=None) -> dst
  • src1 : 첫 번째 영상 또는 스칼라
  • src2 : 두 번째 영상 또는 스칼라
  • dst : 뺄셈 연산 결과 영상
  • mask : 마스크 영상
  • dtype : 출력 영상(dst)의 타입

차이연산

  • 두 영상의 같은 위치에 존재하는 픽셀 값에 대하여 뺄셈 연산을 수행한 후, 그 절댓값을 결과 영상의 픽셀 값
  • 뺄셈 연산과 달리 입력 영상의 순서에 영향을 받지 않음

cv2.absdiff(src1, src2, dst=None) -> dst
  • src1 : 첫 번째 영상 또는 스칼라

  • src2 : 두 번째 영상 또는 스칼라

  • dst : 차이 연산 결과 영상(차영상)

  • 실습코드

import sys
import numpy as np
import cv2
from matplotlib import pyplot as plt

src1 = cv2.imread('lenna256.bmp', cv2.IMREAD_GRAYSACLE)
src2 = cv2.imread('square.bmp', cv2.IMREAD_GRAYSCALE)

dst1 = cv2.add(src1, src2, dtype=cv2.CV_8U)
dst2 = cv2.addWeighted(src1, 0.5, scr2, 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()

*absidff

  • 가운데 부분이 반전된 것 같은 효과 발생

  • 포화가되지 않는다.

영상의 논리 연산

  • 비트단위 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: 마스크 영상

  • 참고사항

profile
성장을 도울 아카이빙 블로그

0개의 댓글