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

이미지 연산 (2)

이미지 연산은 하나 또는 둘 이상의 이미지에 대해 비트 연산 또는 비교 연산을 수행합니다.

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

  • Tip : OpenCvSharp에서는 비교 연산 표현(<, = 등)은 지원하지 않습니다.



메인 코드

using System;
using OpenCvSharp;

namespace Project
{
    class Program
    {
        static void Main(string[] args)
        {
            Mat src1 = new Mat("fairy.jpg", ImreadModes.ReducedColor2);
            Mat src2 = src1.Flip(FlipMode.Y);

            Mat and = new Mat();
            Mat or = new Mat();
            Mat xor = new Mat();
            Mat not = new Mat();
            Mat compare = new Mat();

            Cv2.BitwiseAnd(src1, src2, and);
            Cv2.BitwiseOr(src1, src2, or);
            Cv2.BitwiseXor(src1, src2, xor);
            Cv2.BitwiseNot(src1, not);
            Cv2.Compare(src1, src2, compare, CmpTypes.EQ);

            Cv2.ImShow("and", and);
            Cv2.ImShow("or", or);
            Cv2.ImShow("xor", xor);
            Cv2.ImShow("not", not);
            Cv2.ImShow("compare", compare);
            Cv2.WaitKey(0);
        }   
    }
}


세부 코드

Mat src1 = new Mat("fairy.jpg", ImreadModes.ReducedColor2);
Mat src2 = src1.Flip(FlipMode.Y);

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

src2은 이미지 연산을 위한 값입니다. 좌우 대칭으로 행렬 연산을 진행합니다.

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


Mat and = new Mat();
Mat or = new Mat();
Mat xor = new Mat();
Mat not = new Mat();
Mat compare = new Mat();

연산 결과를 저장할 and, or, xor, not, compare를 선언합니다.

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

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


Cv2.BitwiseAnd(src1, src2, and);

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

Cv2.BitwiseAnd(원본 배열 1, 원본 배열 2, 결과 배열)로 논리곱을 적용합니다.

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

src1의 픽셀값이 (243, 243, 243)이고, src2의 픽셀값이 (249, 249, 249)라면 and 픽셀값은 (241, 241, 241)이 됩니다.

243의 비트값은 11110011이며, 249의 비트값은 11111001이 됩니다.

각 비트 자리수 별로 연산을 진행하면, 11110001이 됩니다.

11110001의 10진수 값은 241이 됩니다.


Cv2.BitwiseOr(src, src2, or);

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

Cv2.BitwiseOr(원본 배열 1, 원본 배열 2, 결과 배열)로 논리곱을 적용합니다.

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

src1의 픽셀값이 (243, 243, 243)이고, src2의 픽셀값이 (249, 249, 249)라면 or 픽셀값은 (251, 251, 251)이 됩니다.

243의 비트값은 11110011이며, 249의 비트값은 11111001이 됩니다.

각 비트 자리수 별로 연산을 진행하면, 11111011이 됩니다.

11111011의 10진수 값은 251이 됩니다.


Cv2.BitwiseXor(src1, src2, xor);

배타적 논리합 함수(Cv2.BitwiseXor)배열과 배열 또는 배열과 스칼라의 요소별 배타적 논리합을 계산합니다.

Cv2.BitwiseXor(원본 배열 1, 원본 배열 2, 결과 배열)로 배타적 논리합을 적용합니다.

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

src1의 픽셀값이 (243, 243, 243)이고, src2의 픽셀값이 (249, 249, 249)라면 xor 픽셀값은 (10, 10, 10)이 됩니다.

243의 비트값은 11110011이며, 249의 비트값은 11111001이 됩니다.

각 비트 자리수 별로 연산을 진행하면, 00001010이 됩니다.

00001010의 10진수 값은 10이 됩니다.


Cv2.BitwiseNot(src1, not);

논리 부정 함수(Cv2.BitwiseNot)배열과 배열 또는 배열과 스칼라의 요소별 논리 부정을 계산합니다.

Cv2.BitwiseNot(원본 배열, 결과 배열)로 배타적 논리 부정을 적용합니다.

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

src1의 픽셀값이 (243, 243, 243)라면, not 픽셀값은 (12, 12, 12)이 됩니다.

243의 비트값은 11110011이며, 각 비트 자리수 별로 연산을 진행하면, 00001100이 됩니다.

00001100의 10진수 값은 12가 됩니다.


Cv2.Compare(src1, src2, compare, CmpTypes.EQ);

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

Cv2.Compare(원본 배열 1, 원본 배열 2, 결과 배열, 비교 플래그)로 비교를 적용합니다.

두 배열의 요소 중 비교 플래그로 결과 배열의 요솟값이 할당됩니다.

src1의 픽셀값이 (245, 245, 245)이고, src2의 픽셀값이 (245, 244, 246)라면, compare 픽셀값은 (255, 0, 0)이 됩니다.

비교 함수의 결과값은 조건에 부합하면 255이며, 아니라면 0이 됩니다.

같음 플래그(CmpTypes.EQ)로 두 배열의 값을 비교해, 첫 번째 원소값만 조건에 부합하므로 255이 되며, 나머지 원소값은 0이됩니다.



비교 플래그 종류

속성 의미
CmpTypes.EQ src1과 src2의 요소가 같음
CmpTypes.GT src1이 src2보다 요소가 큼
CmpTypes.GE src1이 src2보다 요소가 크거나 같음
CmpTypes.LT src1이 src2보다 요소가 작음
CmpTypes.LE src1이 src2보다 요소가 작거나 같음
CmpTypes.NE src1과 src2의 요소가 같지 않음



출력 결과

And


Or


Xor


Not


Compare(EQ)

댓글 남기기