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 추가 설명
결과