C# OpenCV 이미지 전처리

2021. 1. 6. 09:00OpenCV/OpenCV C#

반응형

1. 색상 공간 변환

색상 공간 변환은 본래의 색상 공간에서 다른 생상 공간으오 변환 할 때 사용한다.

색상 공간 변환 함수는 데이터 타입을 같게 유지하고 채널을 변환한다.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using OpenCvSharp;

namespace ImagePreprocessing
{
    class Program
    {
        static void Main(string[] args)
        {
            Mat src = Cv2.ImRead("../../opencv.png"); 
            Mat dst = new Mat(src.Size(), MatType.CV_8UC1);

            Cv2.CvtColor(src, dst, ColorConversionCodes.BGR2GRAY);

            Cv2.ImShow("dst", dst);
            Cv2.WaitKey(0);
            Cv2.DestroyAllWindows();
        }
    }
}

ImRead 함수를 사용해 이미지를 src에 할당한다.

dst는 변환된 이미지를 저장할 공간이다.

색상 공간 변환 함수(Cv2.CvtColor)를 활용해 이미지를 변환한다.

CV2. CVtColor(원본이미지, 결과 이미지, 색상 변환 코드)로 색상 공간을 변환한다.

 

결과

1

 

2. 대칭

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using OpenCvSharp;

namespace ImagePreprocessing
{
    class Program
    {
        static void Main(string[] args)
        {
            Mat src = Cv2.ImRead("../../opencv.png");
            Mat dst = new Mat(src.Size(), MatType.CV_8UC3);

            Cv2.Flip(src, dst, FlipMode.Y);

            Cv2.ImShow("dst", dst);
            Cv2.WaitKey(0);
            Cv2.DestroyAllWindows();
        }
    }
}

대칭 함수(CvFlip)를 활용해 이미지를 변환한다.

Cv2.Flip(원본 이미지, 결과 이미지, 대칭 축)로 생삭 공간을 변환한다.

대칭 축(FlipMode)를 사용해 X축, Y축, XY축 대칭을 진행할 수 있다.

 

결과

2

 

3. 확대 & 축소

확대와 축소는 입력 이미지를 크기를 단계적으로 변화시켜 원하는 단계에 도달할 때까지 진행하는 이미지 피라미드를 사용한다.

객체가 너무 작거나 입력 이미지가 너무 큰 경우 입력 이미지 자체를 변환해서 영상 처리를 진행한다.

이미지 피라미드는 가우시안 피라미드(Gaussian Pyramid)와 라플라시안 피라미드(Laplacian pyramid)를 활용합니다.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using OpenCvSharp;

namespace ImagePreprocessing
{
    class Program
    {
        static void Main(string[] args)
        {
            Mat src = new Mat("../../opencv.png", ImreadModes.ReducedColor2);
            Mat pyrUp = new Mat();
            Mat pyrDown = new Mat();

            Cv2.PyrUp(src, pyrUp);
            Cv2.PyrDown(src, pyrDown);

            Cv2.ImShow("pyrUp", pyrUp);
            Cv2.ImShow("pyrDown", pyrDown);
            Cv2.WaitKey(0);
        }
    }
}

pyUP은 확대된 이미지를 저장할 변수이다.

pyDown은 축소된 이미지를 저장할 변수이다.

 

확대 함수(Cv2.PyrUp) 또는 축소 함수(Cv2.PyrDown)를 활용해서 이미지를 변환한다.

Cv2.Pyr*(원본 이미지, 결과 이미지, 결과 이미지 크기, 테두리 외삽법) 으로 이미지 크기를 변환한다.

 

결과

3

 

4. 크기 조절

영상이나 이미지의 크기를 원하는 크기로 조절할 수 있다.

이미지를 확대하는 경우 픽셀에 대한 보간법, 이미지를 축소하는 경우에는 픽셀에 대한 병합법이 수행된다.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using OpenCvSharp;

namespace ImagePreprocessing
{
    class Program
    {
        static void Main(string[] args)
        {
            Mat src = new Mat("../../opencv.png");
            Mat dst = new Mat();

            Cv2.Resize(src, dst, new Size(500, 250));

            Cv2.ImShow("src", src);
            Cv2.ImShow("dst", dst);
            Cv2.WaitKey(0);
        }
    }
}

크기 조절 함수(Cv2.Resize)를 활용해 이미지를 변환한다.

Cv2.Resize(원본 이미지, 결과 이미지, 절대 크기, 상대 크기(X), 상대 크기(Y), 보간법)으로 이미지 크기를 변환한다.

이미지 크기를 조절할 때, 절대 크기 또는 상대 크기를 사용해 이미지의 크기를 조절한다.

절대크기는 Size 구조체로 크기를 설정할 수 있다.

절대 크기는 필수 매개변수이고, 상대크기는 선택(옵션) 매개변수이다.

절대 크기의 Size 구조체의 값 중 하나 이상은 0의 값을 사용해야 상대 크기의 값으로 인식된다.

 

결과

4

5. 자르기

이미지를 자르는 것을 관심 영역 지정 또는 하위 행렬 생성이라고 부른다.

특정 영역에 대해서 작업하기 때문에 관심 영역, 이미지 행렬이므로 특정 부분을 잘라내기 때문에 하위 행렬이라고 부른다.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using OpenCvSharp;

namespace ImagePreprocessing
{
    class Program
    {
        static void Main(string[] args)
        {
            Mat src = new Mat("../../opencv.png");
            Mat dst = src.SubMat(new Rect(100, 100, 100, 100));

            Cv2.ImShow("src", src);
            Cv2.ImShow("dst", dst);
            Cv2.WaitKey(0);
        }
    }
}

하위 행력 메서드(*.SubMat)를 활용해 하위 행렬을 생성한다.

*.SubMat()는 Range구조체, Rect구조체, int할당 등을 통해 생성할 수 있다.

예제의 방식은 int 방식을 활용한다.

 

결과

5

 

6. 이진화

영상이나 이미지의 어느 지점을 기준으로 픽셀을 분류해 제외한다.

특정 값을 기준으로 값이 높거나 낮은 픽셀을 검은색 또는 흰색의 값으로 변경한다.

기준값에 따라 이분법적으로 구분해 픽셀을 참 또는 거짓으로 나누는 연산이다.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using OpenCvSharp;

namespace ImagePreprocessing
{
    class Program
    {
        static void Main(string[] args)
        {
            Mat src = new Mat("../../opencv.png");
            Mat gray = new Mat();
            Mat binary = new Mat();

            Cv2.CvtColor(src, gray, ColorConversionCodes.BGR2GRAY);
            Cv2.Threshold(gray, binary, 150, 255, ThresholdTypes.Binary);

            Cv2.ImShow("src", src);
            Cv2.ImShow("dst", binary);
            Cv2.WaitKey(0);
        }
    }
}

색상 공간 변환 함수(Cv2.CvtColor)를 활용해 색상 이미지에서 흑백 이미지로 변환한다.

이진화를 적용할 때 가장 많이 선행으로 적용되는 변환법이다.

이진화 함수(Cv2.Threshold)를 활용해 이미지를 이진화한다.

 

Cv2.Threshold(원본 이미지, 결과 이미지, 임곗값, 최댓값, 임곗값 형식)로 이진화를 적용한다.

임곗값 형식에 따라 이진화 방식을 설정합니다.

임곗값 보다 낮은 픽셀값은 0이나 원본 픽셀값으로 변경하며, 임곗값보다 높은 픽셀값은 최댓값으로 변경합니다.

 

결과

6

 

7. 이미지 연산(1)

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

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

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using OpenCvSharp;

namespace ImagePreprocessing
{
    class Program
    {
        static void Main(string[] args)
        {
            Mat src = new Mat("../../opencv.png", 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);
        }
    }
}

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

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

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

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

 

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

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

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

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

Tip : src1과 src2의 위치에 따라 결과가 달라지므로 배열의 순서에 유의해야 한다.

 

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

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

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

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

 

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

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

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

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

 

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

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

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

 

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

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

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

 

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

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

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

 

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

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

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

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

 

결과

7

8. 이미지 연산(2)

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

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

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

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using OpenCvSharp;

namespace ImagePreprocessing
{
    class Program
    {
        static void Main(string[] args)
        {
            Mat src1 = new Mat("../../opencv.png", 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);
        }
    }
}

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

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

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

 

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

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

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

 

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

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

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

 

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

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

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

 

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

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

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

 

결과

8

반응형

'OpenCV > OpenCV C#' 카테고리의 다른 글

C# OpenCV Transformation  (0) 2021.01.17
C# OpenCV labeling Segmentation  (0) 2021.01.12
C# OpenCV histogram gray color BGR 그리기  (0) 2021.01.09
C# OpenCV 설치하기 (OpenCvSharp4 최신버전 설치)  (1) 2021.01.05
C# OpenCV 설치하기  (1) 2021.01.01