C#/C# OpenCV/

C# OpenCV 5-3. 색상 추출

2019. 11. 20.

대표함수

Cv2.InRage 사용자 지정 Scalar범위 픽셀을 추출

Cv2.CvtColor 이전 강의 참조([프로그래밍/C# OpenCV] - C# OpenCV 5-1. 색공간 변환)

Cv2.Split 이전 강의 참조([프로그래밍/C# OpenCV] - C# OpenCV 5-2. 채널 분리 & 병합)

 

Example Code

using System;
using System.Windows.Forms;
using OpenCvSharp;

namespace hueExtract
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            Mat src = Cv2.ImRead("hue.png");
            Mat[] mv = new Mat[3];
            Mat mask = new Mat();
            Cv2.ImShow("src", src);

            Cv2.CvtColor(src, src, ColorConversionCodes.BGR2HSV);
            mv = Cv2.Split(src);
            Cv2.CvtColor(src, src, ColorConversionCodes.HSV2BGR);

            Cv2.InRange(mv[0], new Scalar(40), new Scalar(75), mask);
            Cv2.BitwiseAnd(src, mask.CvtColor(ColorConversionCodes.GRAY2BGR), src);
            Cv2.ImShow("result", src);

            Cv2.WaitKey(0);
            Cv2.DestroyAllWindows();
        }
    }
}

 

Explain Code

일반적으로 색상 추출은 BGR이미지 형식보다 HSV이미지 형식을 선호한다.

HSV이미지 형식 이란

H : Hue 색상

    가시광선 스펙트럼을 고리형태로 배열

    파장이 가장 긴 빨강을 0º 라고 하였을 때 상대적인 배치 각도

    따라서 일반적으로 H 값은 0~360의 값을 가진다.

    하지만 OpenCV에서는 0~180의 값을 가진다

 

S : Saturation 채도

    특정한 색상의 가장 진한 상태를 100%로 하였을 때 진함의 정도를 나타낸다

    채도값 0%는 같은 명도의 무채색을 나타낸다

    OpenCV에서는 0~255의 값을 가진다

 

V : Value 명도

    흰색, 빨간색 등을 100%, 검은색을 0%로 하였을 때 밝은 정도를 나타낸다

    OpenCV에서는 0~255의 값을 가진다

 

색추출시 필요한 값은 Hue값

Hue값을 기준으로 일정영역내 색상을 나타내는 마스크를 생성

원본이미지에 And 연산을 해줌으로서 원하는 색상 추출가능.

 


Cv2.CvtColor(src, src, ColorConversionCodes.BGR2HSV);
mv = Cv2.Split(src);
Cv2.CvtColor(src, src, ColorConversionCodes.HSV2BGR);

HSV 색공간으로 변환Hue채널 이미지를 얻기 위해 채널 분리해줌

분리 후 원본이미지는 다시 BGR 색공간으로 변환

 
 
Cv2.InRange(mv[0], new Scalar(40), new Scalar(75), mask);

Cv2.InRange(src, Scalar lowerb, Scalar upperb, dst)

      src 입력

      lowerb 최솟값

      upperb 최댓값

      dst 출력

원하는 범위 lowerb ~ upperb 를 이용 mask 생성

※ Hue 채널은 1채널이기때문이 1채널 Scalar 사용

 


Cv2.BitwiseAnd(src, mask.CvtColor(ColorConversionCodes.GRAY2BGR), src);

Cv2.BitwisrAnd(src1, src2, dst)

      src1, src2 입력1,2

      dst 출력

※ 원본 이미지는 3채널, 생성한 mask는 1채널

   채널수를 맞춰주기 위해 Mat.CvtColor(ColorConversionCodes) 를 이용 1채널 mask 를 3채널로 확장 

[프로그래밍/C# OpenCV] - C# OpenCV 6-1. BitWise 연산

[프로그래밍/C# OpenCV] - C# OpenCV 6-2. BitWise 추가 설명

 

결과