Favicon

Arithmetic operations

Peponi2/17/20256m

C#
NugetPackageOpenCvSharp4

1. Introduction

OpenCvSharp4는 이미지에 대한 연산 기능을 제공하여 이미지와 이미지, 이미지와 스칼라 연산을 쉽게 할 수 있다. 이 때, 연산은 각 픽셀의 채널별로 수행된다.

이 문서에서는 다음 메서드에 대한 예시를 간략하게 알아본다.

  • Cv2.Add()
  • Cv2.Subtract()
  • Cv2.Multiply()
  • Cv2.Divide()
  • Cv2.Max()
  • Cv2.Min()
  • Cv2.Abs()
  • Cv2.AbsDiff()

실습에 사용할 이미지는 다음과 같다.

Image by Vikash Kr Singh from PixabayImage by sebastian del val from Pixabay

2. Add

Cv2.Add

Cv2.Add() 메서드는 다음 연산을 수행한다.

  1. 이미지 + 이미지
    result[i]=saturate(image1[i]+image2[i])ifmask[i]0result[i] = saturate(image1[i]\,+\,image2[i]) \quad\text{if}\enspace mask[i] \not = 0
  2. 이미지 + 스칼라
    result[i]=saturate(image[i]+value)ifmask[i]0result[i] = saturate(image[i]\,+\,value) \quad\text{if}\enspace mask[i] \not = 0

이미지 간 연산을 빠르게 연산을 수행할 수 있도록 + 연산자 또한 지원한다. (스칼라의 경우 지원하지 않는다.)

이미지 + 이미지
private void Add(Mat image1, Mat image2)
{
    using var result1 = image1 + image2;
 
    using var result2 = new Mat();
    Cv2.Add(image1, image2, result2);
}
이미지 + 스칼라
private void Add(Mat image)
{
    using var result = new Mat();
    Cv2.Add(image, 20, result);
}

3. Subtract

Cv2.Subtract

Cv2.Subtract() 메서드는 다음 연산을 수행한다.

  1. 이미지 - 이미지
    result[i]=saturate(image1[i]image2[i])ifmask[i]0result[i] = saturate(image1[i]\,-\,image2[i]) \quad\text{if}\enspace mask[i] \not = 0
  2. 이미지 - 스칼라
    result[i]=saturate(image[i]value)ifmask[i]0result[i] = saturate(image[i]\,-\,value) \quad\text{if}\enspace mask[i] \not = 0

이미지 간 연산을 빠르게 연산을 수행할 수 있도록 - 연산자 또한 지원한다. (스칼라의 경우 지원하지 않는다.)

이미지 - 이미지
private void Subtract(Mat image1, Mat image2)
{
    using var result1 = image1 - image2;
 
    using var result2 = new Mat();
    Cv2.Subtract(image1, image2, result2);
}
이미지 - 스칼라
private void Subtract(Mat image)
{
    using var result = new Mat();
    Cv2.Subtract(image, 20, result);
}

4. Multiply

Cv2.Multiply

Cv2.Multiply() 메서드는 다음 연산을 수행한다.

  1. 이미지 * 이미지
    result[i]=saturate(image1[i]image2[i])result[i] = saturate(image1[i]\,*\,image2[i])
  2. 이미지 * 스칼라
    result[i]=saturate(image[i]value)result[i] = saturate(image[i]\,*\,value)

스칼라 연산을 빠르게 연산을 수행할 수 있도록 * 연산자 또한 지원한다. (이미지 간 연산의 경우 지원하지 않는다.)

이미지 * 이미지
private void Multiply(Mat image1, Mat image2)
{
    using var result = new Mat();
    Cv2.Multiply(image1, image2, result);
}
이미지 * 스칼라
private void Multiply(Mat image)
{
    using var result1 = image * 5;
 
    using var result2 = new Mat();
    Cv2.Multiply(image, 10, result2);
}

5. Divide

Cv2.Divide

Cv2.Divide() 메서드는 다음 연산을 수행한다.

  1. 이미지 / 이미지
    result[i]=saturate(image1[i]/image2[i])result[i] = saturate(image1[i]\,/\,image2[i])
  2. 이미지 / 스칼라
    result[i]=saturate(image[i]/value)result[i] = saturate(image[i]\,/\,value)

연산을 빠르게 연산을 수행할 수 있도록 / 연산자 또한 지원한다.

이미지 / 이미지
private void Divide(Mat image1, Mat image2)
{
    using var result1 = image1 / image2;
 
    using var result2 = new Mat();
    Cv2.Divide(image1, image2, result2);
}
이미지 / 스칼라
private void Divide(Mat image)
{
    using var result1 = image / 5;
 
    using var result2 = new Mat();
    Cv2.Divide(image, 10, result2);
}

6. Max

Cv2.Max

Cv2.Max() 메서드는 다음 연산을 수행한다.

  1. 이미지, 이미지
    result[i]=max(image1[i],image2[i])result[i] = max(image1[i],\,image2[i])
  2. 이미지, 스칼라
    result[i]=max(image[i],value)result[i] = max(image[i],\,value)
이미지, 이미지
private void Max(Mat image1, Mat image2)
{
    using var result = new Mat();
    Cv2.Max(image1, image2, result);
}
이미지, 스칼라
private void Max(Mat image)
{
    using var result = new Mat();
    Cv2.Max(image, 50, result);
}

7. Min

Cv2.Min

Cv2.Min() 메서드는 다음 연산을 수행한다.

  1. 이미지, 이미지
    result[i]=min(image1[i],image2[i])result[i] = min(image1[i],\,image2[i])
  2. 이미지, 스칼라
    result[i]=min(image[i],value)result[i] = min(image[i],\,value)
이미지, 이미지
private void Min(Mat image1, Mat image2)
{
    using var result = new Mat();
    Cv2.Min(image1, image2, result);
}
이미지, 스칼라
private void Min(Mat image)
{
    using var result = new Mat();
    Cv2.Min(image, 50, result);
}

8. Abs

Cv2.Abs

Cv2.Abs() 메서드는 다음 연산을 수행한다.

  1. MatExpr : 주어진 연산 수행 후 absolute value 계산
    result[i]=abs(MatExpr)result[i] = abs(MatExpr)
  2. Mat : 주어진 matrix의 absolute value 계산
    result[i]=abs(Mat)result[i] = abs(Mat)
MatExpr
private void Abs(Mat image1, Mat image2)
{
    using var expr = image1 - image2;
    using var result = Cv2.Abs(expr);
}
Mat
private void Abs(Mat image)
{
    using var result = Cv2.Abs(image);
}

9. AbsDiff

Cv2.AbsDiff

Cv2.AbsDiff() 메서드는 다음 연산을 수행한다.

  1. 이미지, 이미지
    result[i]=saturate(image1[i]image2[i])result[i] = saturate(\,\vert\, image1[i]\,-\,image2[i]\,\vert\,)
  2. 이미지, 스칼라
    result[i]=saturate(image[i]value)result[i] = saturate(\,\vert\, image[i]\,-\,value\,\vert\,)
이미지, 이미지
private void AbsDiff(Mat image1, Mat image2)
{
    using var result = new Mat();
    Cv2.Absdiff(image1, image2, result);
}
이미지, 스칼라
private void AbsDiff(Mat image)
{
    using var result = new Mat();
    Cv2.Absdiff(image, 50, result);
}

10. 참조 자료