상위 목록: 하위 목록: 작성 날짜: 읽는 데 20 분 소요

이미지 연산 (1)

이미지 연산은 하나 또는 둘 이상의 이미지에 대해 수학적인 연산을 수행합니다.

Mat 클래스의 행렬 연산은 C# OpenCvSharp의 대수적 표현(+, - 등)을 통해서도 Mat 클래스 간의 연산을 수행할 수 있습니다.



메인 코드

using System;
using OpenCvSharp;

namespace Project
{
    class Program
    {
        static void Main(string[] args)
        {
            Mat src = new Mat("flamingo.jpg", ImreadModes.ReducedColor2);
            Mat val = new Mat(src.Size(), MatType.CV_8UC3, new Scalar(0, 0, 30));

            Mat add = new Mat();
            Mat sub = new Mat();
            Mat mul = new Mat();
            Mat div = new Mat();
            Mat max = new Mat();
            Mat min = new Mat();
            Mat abs = new Mat();
            Mat absdiff = new Mat();

            Cv2.Add(src, val, add ;
            Cv2.Subtract(src, val, sub);
            Cv2.Multiply(src, val, mul);
            Cv2.Divide(src, val, div);
            Cv2.Max(src, mul, max);
            Cv2.Min(src, mul, min);
            abs = Cv2.Abs(mul);
            Cv2.Absdiff(src, mul, absdiff);

            Cv2.ImShow("add", add);
            Cv2.ImShow("sub", sub);
            Cv2.ImShow("mul", mul);
            Cv2.ImShow("div", div);
            Cv2.ImShow("max", max);
            Cv2.ImShow("min", min);
            Cv2.ImShow("abs", abs);
            Cv2.ImShow("absdiff", absdiff);
            Cv2.WaitKey(0);
        }   
    }
}


세부 코드

Mat src = new Mat("flamingo.jpg", ImreadModes.ReducedColor2);
Mat val = new Mat(src.Size(), MatType.CV_8UC3, new Scalar(0, 0, 30));

new Mat을 사용해 이미지를 src에 할당합니다.

val은 이미지 연산을 위한 값입니다. B:0, G:0, R:30으로 행렬 연산을 진행합니다.

  • Tip : 연산을 위한 이미지는 src이미지 크기, 데이터 타입, 깊이를 모두 일치해야합니다.


Mat add = new Mat();
Mat sub = new Mat();
Mat mul = new Mat();
Mat div = new Mat();
Mat max = new Mat();
Mat min = new Mat();
Mat abs = new Mat();
Mat absdiff = new Mat();

연산 결과를 저장할 add, sub, mul, div, max, min, abs, absdiff를 선언합니다.

대부분의 이미지 연산 관련 함수는 반환 형식을 void로 가집니다.

즉, 메모리 공간을 미리 할당합니다.


Cv2.Add(src, val, add);

덧셈 함수(Cv2.Add)배열과 배열 또는 배열과 스칼라의 요소별 을 계산합니다.

Cv2.Add(원본 배열 1, 원본 배열 2, 결과 배열, 마스크, 반환 형식)로 덧셈을 적용합니다.

수식으로 표현할 경우 dst = src1 + src2;의 형태를 갖습니다.

마스크가 null이 아닌 경우, 마스크의 요솟값이 0이 아닌 곳만 연산을 진행합니다.


Cv2.Subtract(src, val, sub);

뺄셈 함수(Cv2.Subtract)배열과 배열 또는 배열과 스칼라의 요소별 를 계산합니다.

Cv2.Subtract(원본 배열 1, 원본 배열 2, 결과 배열, 마스크, 반환 형식)로 뺄셈을 적용합니다.

수식으로 표현할 경우 dst = src1 - src2;의 형태를 갖습니다.

마스크가 null이 아닌 경우, 마스크의 요솟값이 0이 아닌 곳만 연산을 진행합니다.

  • Tip : src1src2의 위치에 따라 결과가 달라지므로 배열의 순서에 유의해야 합니다.


Cv2.Multiply(src, val, mul);

곱셈 함수(Cv2.Multiply)배열과 배열 또는 배열과 스칼라의 요소별 을 계산합니다.

Cv2.Multiply(원본 배열 1, 원본 배열 2, 결과 배열, 비율, 반환 형식)로 곱셈을 적용합니다.

수식으로 표현할 경우 dst = src1 * src2;의 형태를 갖습니다.

비율이 null이 아닌 경우, 연산에 비율값을 추가로 곱합니다.


Cv2.Divide(src, val, div);

나눗셈 함수(Cv2.Add)배열과 배열 또는 배열과 스칼라의 요소별 나눗셈을 계산합니다.

Cv2.Divide(원본 배열 1, 원본 배열 2, 결과 배열, 비율, 반환 형식)로 나눗셈을 적용합니다.

수식으로 표현할 경우 dst = src1 / src2;의 형태를 갖습니다.

비율이 null이 아닌 경우, 연산에 비율값을 추가로 곱합니다.


Cv2.Max(src, mul, max);

최댓값 함수(Cv2.Max)배열과 배열 또는 배열과 스칼라의 요소별 최댓값을 계산합니다.

Cv2.Max(원본 배열 1, 원본 배열 2, 결과 배열)로 최댓값을 적용합니다.

두 배열의 요소 중 최댓값인 값으로 결과 배열의 요솟값이 할당됩니다.


Cv2.Min(src, mul, min);

최솟값 함수(Cv2.Min)배열과 배열 또는 배열과 스칼라의 요소별 최솟값을 계산합니다.

Cv2.Min(원본 배열 1, 원본 배열 2, 결과 배열)로 최솟값을 적용합니다.

두 배열의 요소 중 최솟값인 값으로 결과 배열의 요솟값이 할당됩니다.


abs = Cv2.Abs(mul);

절댓값 함수(Cv2.Abs)배열의 요소별 절댓값을 계산합니다.

Cv2.Min(원본 배열)로 절댓값을 적용합니다.

절댓값 함수는 반환 형식이 행렬 표현식(MatExpr 클래스)이며, 매개변수로도 활용할 수 있어 특수한 경우 적절한 연산을 수행할 수 있습니다.


Cv2.Absdiff(src, mul, absdiff);

절댓값 차이 함수(Cv2.Absdiff)배열과 배열 또는 배열과 스칼라의 요소별 절댓값 차이을 계산합니다.

Cv2.Absdiff(원본 배열 1, 원본 배열 2, 결과 배열)로 절댓값 차이를 적용합니다.

덧셈 함수나 뺄셈 함수에서는 두 배열의 요소를 서로 뺄셈했을 때 음수가 발생하면 0을 반환했습니다.

하지만, 절댓값 차이 함수는 이 값을 절댓값으로 변경해서 양수 형태로 반환합니다.



출력 결과

Add


Sub


Mul


Div


Max


Min


Abs


Absdiff

댓글 남기기