C# OpenCV 강좌 : 제 15강 - HSV

   

HSV (Hue, Saturation, Value)


1 영상이나 이미지를 색상을 검출 하기 위해 사용합니다. 채널을 Hue, Saturation, Value로 분리하여 변환할 수 있습니다.


  • 색상 (Hue) : 색의 질입니다. 빨강, 노랑, 파랑이라고 하는 표현으로 나타내는 성질입니다.
  • 채도 (Saturation) : 색의 선명도입니다. 아무것도 섞지 않아 맑고 깨끗하며 원색에 가까운 것을 채도가 높다고 표현합니다.
  • 명도 (Value) : 색의 밝기입니다. 명도가 높을수록 백색에, 명도가 낮을수록 흑색에 가까워집니다.


원본(Source, src)를 영상이나 이미지를 사용하면 됩니다.


영상 사용하기 : 3강 바로가기
이미지 사용하기 : 4강 바로가기


Class


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

namespace test
{
    class OpenCV : IDisposable
    {
        IplImage hsv;
            
        public IplImage HSV(IplImage src)
        {
            hsv = new IplImage(src.Size, BitDepth.U8, 3);
            IplImage h = new IplImage(src.Size, BitDepth.U8, 1);
            IplImage s = new IplImage(src.Size, BitDepth.U8, 1);
            IplImage v = new IplImage(src.Size, BitDepth.U8, 1);

            Cv.CvtColor(src, hsv, ColorConversion.BgrToHsv);
            Cv.Split(hsv, h, s, v, null);
            hsv.SetZero();

            //Hue//        
            Cv.InRangeS(h, MIN, MAX, h);
            Cv.Copy(src, hsv, h);
                    
            //Saturation//     
            //Cv.InRangeS(s, MIN, MAX, s);
            //Cv.Copy(src, hsv, s);   
                                     
            //Value//        
            //Cv.InRangeS(v, MIN, MAX, v); //
            //Cv.Copy(src, hsv, v);
                            
            return hsv;
        }
            
        public void Dispose()
        {
            if (hsv != null) Cv.ReleaseImage(hsv);
        }
    }
}


Class Code


public IplImage HSV(IplImage src)
{
    hsv = new IplImage(src.Size, BitDepth.U8, 3);
    IplImage h = new IplImage(src.Size, BitDepth.U8, 1);
    IplImage s = new IplImage(src.Size, BitDepth.U8, 1);
    IplImage v = new IplImage(src.Size, BitDepth.U8, 1);
}

HSV의 각각의 경우 단색이기 때문에 채널은 1입니다. 채널을 각각 Hue(h), Saturation(s), Value(v)로 분리하였습니다.

Cv.CvtColor(src, hsv, ColorConversion.BgrToHsv);

Cv.CvtColor()를 이용하여 HSV로 변환합니다.

Cv.Split(hsv, h, s, v, null);

hsv의 채널을 1 개의 채널로 분리하기 위해서 Cv.Split()을 이용하여 h, s, v로 분리합니다.

hsv.SetZero();

hsv의 배열을 초기화 시킵니다.

  • Tip : 배열을 초기화하지 않았을 경우 결과가 다르게 나올 수 있습니다.
//Hue//        
Cv.InRangeS(h, MIN, MAX, h);
Cv.Copy(src, hsv, h);

//Saturation//     
Cv.InRangeS(s, MIN, MAX, s);
Cv.Copy(src, hsv, s);   
                         
//Value//        
Cv.InRangeS(v, MIN, MAX, v); //
Cv.Copy(src, hsv, v);

Cv.InRangeS()를 사용하여 채널의 최소치와 최대치를 설정합니다. Cv.InRangeS(원본, 최소, 최대, 결과)입니다. 원본에 결과를 덧씌우기 때문에, 원본과 결과의 변수가 동일합니다.

  • 색상 (Hue) : 0 ~ 180의 값을 지닙니다.
  • 채도 (Saturation) : 0 ~ 255의 값을 지닙니다.
  • 명도 (Value) : 0 ~ 255의 값을 지닙니다.


Hue Parameter

2

Saturation & Value

3


Main Code


using (OpenCV Convert = new OpenCV())
{
    pictureBoxIpl2.ImageIpl = Convert.HSV(src);
}

HSV보여질 색상이 적용된 이미지를 표시합니다. 그 이외의 색은 흑색으로 처리됩니다.


Result


Hue - 90 ~ 135

4

Hue - 90 ~ 135 (hsv.SetZero() 미적용)

7

Saturation - 100 ~ 255

5

Value - 50 ~ 200

6



도움이 되셨다면 광고 클릭 부탁드립니다.

⤧  Next post C# OpenCV 강좌 : 제 16강 - Split & Merge ⤧  Previous post C# OpenCV 강좌 : 제 14강 - 가장자리 검출