OpenCV 4로 배우는 컴퓨터 비전과 머신 러닝/ 영상의 산술 및 논리 연산

영상의 산술 연산

  • 영상은 일종의 2차원 행렬이기 때문에 행렬의 산술 연산(arithmetic operation)을 그대로 적용할 수 있다.
    • 즉 두 개의 영상을 서로 더하거나 빼는 연산을 수행함으로써 새로운 결과 영상을 생성할 수 있다.
    • 다만 영상을 서로 곱하거나 나누는 연산은 사용하지 않는다.
  • 두 개의 영상을 서로 더하는 덧셈 연산은 두 개의 입력 영상에서 같은 위치 픽셀 값을 서로 더하여 결과 영상 픽셀 값으로 설정하는 연산이다.

dst(x, y) = saturate(src1(x, y) + src2(x, y))

  • OpenCV에서는 add() 함수를 이용해서 영상의 덧셈을 수행할 수도 있다.
    • add 연산에서는 자동으로 포화 연산을 수행한다.
Mat src1 = imread("aero2.bmp", IMREAD_GRAYSCALE);
Mat src2 = imread("camera.bmp", IMREAD_GRAYSCALE);

Mat dst;
add(src1, src2, dst);
  • 만약 두 영상의 타입이 같다면 add() 대신 + 연산자 재정의를 사용할 수 있다.
Mat src1 = imread("aero2.bmp", IMREAD_GRAYSCALE);
Mat src2 = imread("camera.bmp", IMREAD_GRAYSCALE);

Mat dst = src1 + src2;
  • 두 영상을 더할 때 각 영상에 가중치를 부여하여 덧셈 연산을 할 수도 있다.

dst(x, y) = saturate(\alpha \cdot src1(x, y) + \beta \cdot src2(x, y))

  • OpenCV에서는 addWeighted() 함수를 이용해서 위와 같은 연산을 수행할 수 있다.
    • addWeighted() 함수는 gamma 인자를 통해 가중치의 합에 추가적인 덧셈을 한꺼번에 수행할 수 있다.

dst(x, y) = saturate(\alpha \cdot src1(x, y) + \beta \cdot src2(x, y) + \gamma)

Mat src1 = imread("aero2.bmp", IMREAD_GRAYSCALE);
Mat src2 = imread("camera.bmp", IMREAD_GRAYSCALE);

Mat dst;
addWeighted(src1, 0.5, src2, 0.5, 0, dst);
  • 덧셈과 마찬가지로 뺄셈도 할 수 있다.

dst(x, y) = saturate(src1(x, y) - src2(x, y))

  • OpenCV에서는 subtract() 함수를 통해 두 영상의 뺄셈 연산을 수행할 수 있다.
    • 만약 입력 영상의 타입이 같다면 subtract() 대신 – 연산자 재정의를 사용할 수도 있다.
  • 덧셈과 달리 뺄셈은 연산 순서에 따라 결과가 달라진다.

  • 두 영상의 뺄셈 순서에 상관없이 픽셀 값 차이가 큰 영역을 두드러지게 나타내고 싶다면 차이 연산을 수행하면 된다.
    • 차이 연산은 뺄셈 연산 결과에 절댓값을 취하는 연산이며, 차이 연산으로 구한 결과 영상을 차영상(difference image)라고 한다.

dst(x, y) = saturate(|src1(x, y) - src2(x, y)|)

  • OpenCV에서는 absdiff() 함수를 이용하여 차영상을 구할 수 있다.

영상의 논리 연산

  • 영상의 논리 연산(logical operation)은 픽셀 값을 이진수로 표현하여 각 비트(bit) 단위 논리 연산을 수행하는 것을 의미한다.
    • OpenCV에서는 다양한 논리 연산 중 논리곱(AND), 논리합(OR), 배타적 논리합(XOR), 부정(NOT) 연산을 지원한다.
입력 결과
a b a AND b a OR b a XOR b NOT a
0 0 0 0 0 1
0 1 0 1 1 1
1 0 0 1 1 0
1 1 1 1 0 0

 

  • OpenCV에서 비트 단위 논리 연산을 수행하는 함수는 bitwise_and(), bitwise_or(), bitwise_xor(), bitwise_not()이다.
    • OpenCV는 영상의 비트 단위 논리 연산을 수행하는 연산자 재정의도 지원하므로 &, |, ^, ~ 등을 이용하여 연산할 수도 있다.
[ssba]

The author

지성을 추구하는 사람/ suyeongpark@abyne.com

댓글 남기기

This site uses Akismet to reduce spam. Learn how your comment data is processed.