티스토리 뷰

C#

[C#] HSV에서 Hue 의 거리

PRG 2018.07.09 12:58

 

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;
}

 

 

 

댓글
댓글쓰기 폼