만약 다음과 같은 이미지가 있다고 가정할 때 녹색 초콜렛(m&m)만 검출 하고 싶다면 어떻게 해야할까?

RGB 색공간에서 녹색영역을 추출한다고 가정해보자.

다음과 같이 각각의 색성분에 대한 범위(Range)를 특정하여 조건에 부합하는 픽셀만 검출하면 된다.

하지만 특정 색상을 검출하기 원한다면 RGB 색공간보다는 HSV 색공간을 사용하는 것이 적합하다. 

HSV 색공간을 가시화한 위의 그림을 살펴보자. H는 채도(색상)를 나타내고, S는 채도(색상의 진한 정도)를 그리고 V는 명도(밝은 정도)를 나타낸다. 

즉, RGB 색공간처럼 색상 원소의 조합이 아닌, HSV 색공간은 원하는 색상의 영역을 직관적으로 특정하기에 좋기 때문에 만약 이미지에서 어떤 색상을 갖는 객체를 검출하고 싶다면 HSV 색공간을 사용하는 것이 더 적합하다.

HSV로 녹색을 특정한다면 다음과 같이 조건을 설정할 수 있다.

OpenCV에서는 색공간의 특정 범위 안에 있는 픽셀들을 검출할 수 있는 Core.inRange(src, lowerb, upperb, dst) 함수를 제공한다.

src : 색상을 추출하고자 하는 이미지
lowerb : 최소 HSV 스칼라값
upperb : 최대 HSV 스칼라 값
dst : 색상을 추출한 영상

안드로이드에서 구현한 예제는 다음과 같다.

val h = binding.rangeH.values // RangeSlider를 통해 값의 범위를 가져옴
val s = binding.rangeS.values
val v = binding.rangeV.values
val lowerb = Scalar(h[0].toDouble(),s[0].toDouble(),v[0].toDouble())
val upperb = Scalar(h[1].toDouble(),s[1].toDouble(),v[1].toDouble())
Core.inRange(candies, lowerb, upperb, dst)
//dst를 최종적으로 비트맵으로 변환하여 ImageView에 나타냄
binding.dst.setImageBitmap(bitmapUtil.bitmapFrom(dst)) 
카테고리: OpenCV

0개의 댓글

답글 남기기

Avatar placeholder

이메일은 공개되지 않습니다. 필수 입력창은 * 로 표시되어 있습니다.