HSV 색공간에서 Hue는 0 과 360이 연결되어있는 원형 형태이다.
[ cylinder 모양의 HSV색공간]
H 1= 5 와 H 2= 355 는 비슷한 색상을 의미하지만 Abs(H1 - H2) = 350 으로 거리 차이가 매우 크다.
하지만 원형 형태이기때문에 이런 경우 두 H 사이의 거리는 10 이라고 봐야 될것이다.
한번 제대로된 거리를 구해보자.
반시계 방향의 거리는 350 이고 시계방향의 거리는 10 일 것이다. ( 거리는 각도의 차이이다. )
우리는 두개의 거리중 짧은 거리가 우리가 원하는 거리라는 것을 안다.
따라서, 반시계 방향의 거리가 180 이상일 경우만 시계방향의 거리를 채택해주면 된다.
int H1 = 100;
int distance = Math.Abs(H1-H2);
distance = distance > 180 ? 360 - distance : distance;
OpenCV 에서 HSV색공간은 H의 범위가 [0,180] 이므로 distance > 90 ? 180 - distance : distance 로 구분 해주면 된다.
이것을 바탕으로 거리를 이용한 inRange 함수를 만들어보자.
using OpenCVSharp;
unsafe Mat inRangeD(Mat input,int Hs, int di)
{
//Hs 는 기준이되는 Hue , distance 는 최대 허용거리
Mat out = new Mat(input.Size(), MatType.CV_8UC1, new Scalar(0));
int pos = 0;
int pos2 = 0;
byte* ptr_input = input.DataPointer;
byte* ptr_out = out.DataPointer;
for (int m=0; m < input.rows; m++)
{
for(int n=0; n < input.cols; n++)
{
int distance = Math.Abs(ptr_input[pos]);
distance = distance > 90 ? 180 - distance : distance;
if (distance <= di)
ptr_out[pos2] = 255;
pos+=3;
pos2++;
}
}
return out;
}
'C#' 카테고리의 다른 글
[C#] 실행시간 측정 Stopwatch (3) | 2018.08.13 |
---|---|
[C#] 이미지를 오로지 R , G , B 만으로 표현하기 (색 분류) (0) | 2017.12.28 |
[C#] 픽셀서치 PixelSearch 2 (0) | 2017.09.16 |
[C#] 픽셀서치 PixelSearch (4) | 2017.08.25 |
[C#] Xamarin with CocosSharp 공튀기기 (0) | 2017.03.04 |
댓글