2017-02-23 2 views
0

HSV 이미지가 있고 이미지의 특정 영역에 관심이 있습니다. 이미지를 선택하여 작업하고 관심 영역을 결정했으나 채널을 분리하는 방식이 올바르지 않다고 생각합니다. 내 채널 값이 실제 값에 가까워지지 않습니다. 내가보고있는 이미지의 일부가 RGB 스케일에서 흰색입니다. HSV에서 흰색은 채도가 약 (0..20)이고 값은 (230..255)이지만 프로그램에서 인쇄 한 숫자는 그 범위에 근접하지 않습니다. 저는 S와 -93의 경우 대다수가 V가 낮은 경우 40 점을 얻었습니다. 내 채널 계산이 맞습니까? 그들이 비록 모두 흰색이며,내 채널 분리 계산이 정확합니까?

enter image description here

관심의 지역은 중앙의 왼쪽 상단 스티커입니다 :

public void splitChannels() { 

    Mat firstImage = Imgcodecs.imread("firstImage.jpg"); 
    int width = 20; 
    int height = 20; 
    Rect roi = new Rect(120, 160, width, height); 
    Mat smallImg = new Mat(firstImage, roi); 
    int channels = smallImg.channels(); 
    System.out.println("small pixels:" + smallImg.total()); 
    System.out.println("channels:" + smallImg.channels()); 
    int totalBytes = (int)(smallImg.total() * smallImg.channels()); 
    byte buff[] = new byte[totalBytes]; 
    smallImg.get(0, 0, buff); 

    for (int i=0; i< height; i++) { 
     // stride is the number of bytes in a row of smallImg 
     int stride = channels * width; 
     for (int j=0; j<stride; j+=channels) { 
     //I don't know if these channels calculations are correct. 
      int h = buff[(i * stride) + j]; 
      int s = buff[(i * stride) + j + 1]; 
      int v = buff[(i * stride) + j + 2]; 

      // Do something with the hsv. 
      System.out.println("s: "+ s + " v: " + v); 

     } 
    } 
} 

여기 내 이미지입니다.

HSV의이 프로그램은이가 밖으로 인쇄 :

h: 99 s: 78 v: 57 
h: 97 s: 76 v: 55 
h: 101 s: 77 v: 57 
h: 101 s: 77 v: 57 
h: 103 s: 79 v: 59 
h: 103 s: 79 v: 59 
h: 103 s: 79 v: 59 
h: 102 s: 78 v: 58 
h: 100 s: 76 v: 58 
h: 99 s: 75 v: 57 
h: 98 s: 74 v: 56 
h: 98 s: 74 v: 56 
h: 98 s: 74 v: 54 
h: 99 s: 75 v: 55 
+0

이미지를 공유 할 수 있습니까? –

+0

내 질문 업데이트 내가 그들을 추가합니다 @ RossPresser – cuber

+0

코드에서 무슨 일이 일어나고 있는지 이해하는 좋은 방법은 상수 (알려진) HSV 값의 이미지를 만들고 알고리즘에서 시도하는 것입니다. –

답변

1

그것은 당신이 올바른 값을 받고 있지만, 원시 바이트에서 오는 RGB 강도 것으로 나타납니다. Java 바이트 데이터 유형이 8 비트이기 때문에 -1 -1 -1로 나오지만 서명되지 않은 데이터 유형입니다.

이 값을 RGB에서 HSV로 변환해야합니다. 여기서 변환의 정의에 대한 링크이다 :이 시도 기본 RGB 모델에 의해 지정된대로, 색조, 채도 값의 대응하는 세트로

RGBtoHSB:

는 색의 성분 변환 및 밝기가 HSB 모델의 세 가지 구성 요소입니다.

public static float[] RGBtoHSB(int r, 
          int g, 
          int b, 
          float[] hsbvals) 

사용법 :

int r = ... 
int g = ... 
int b = ... 
float[] hsbvals = new float[3]; 
Color.RGBtoHSB(r,g,b,hsbvals) 
+0

작동하지만 RGB가있는 것처럼 개별 HSV 채널을 얻을 수 있습니까? – cuber

+0

반환 된 부동 배열 hsv, hsv [0], hsvt [1], hsv [2] –

+0

에 각 구성 요소가 있으므로 흰색이 무엇인가? 'H : 0.0 S : -0.0 V -0.003921569 ' – cuber

관련 문제