2010-04-10 5 views

ответ

1

Вот псевдокод для простого конвертера RGB в HSV. Это даст Н UNDEFINED если цвет оттенок серого, в противном случае Н между 0 и 6.

x = min(R, G, B); 
V = max(R, G, B); 
if (V == x) { 
    H = UNDEFINED 
    S = 0 
} 
else { 
    if(R == x) { 
    f = G - B; 
    i = 3; 
    } else if(G == x) { 
    f = B - R; 
    i = 5; 
    } else { 
    f = R - G; 
    i = 1; 
    } 
    H = i - f /(V - x); 
    S = (V - x)/V; 
} 

Теперь вы можете конвертировать все ваши пиксели и бен им строить свой HSV гистограмму, или вы может конвертировать каждый бит вашей гистограммы RGB в корзину HSV.

2

пихты использовать резюме :: cvtColor для преобразования RGB в HSV затем использовать резюме :: calcHist для вычисления гистограммы

0

Вот код, чтобы сделать это:

 // Assume SourceImage is a Bitmap ARGB_8888 
     BitmapFactory.Options options = new BitmapFactory.Options(); 
     options.inPreferredConfig = Bitmap.Config.ARGB_8888; 
     Bitmap refImage = BitmapFactory.decodeFile(mBaseDir + "some_reference.jpg", options); 

     Mat hsvRef = new Mat(); 
     Mat hsvSource = new Mat(); 

     Mat srcRef = new Mat(refImage.getHeight(), refImage.getWidth(), CvType.CV_8U, new Scalar(4)); 
     Utils.bitmapToMat(refImage, srcRef); 


     Mat srcSource = new Mat(SourceImage.getHeight(), SourceImage.getWidth(), CvType.CV_8U, new Scalar(4)); 
     Utils.bitmapToMat(SourceImage, srcSource); 

     /// Convert to HSV 
     Imgproc.cvtColor(srcRef, hsvRef, Imgproc.COLOR_BGR2HSV); 
     Imgproc.cvtColor(srcSource, hsvSource, Imgproc.COLOR_BGR2HSV); 

     /// Using 50 bins for hue and 60 for saturation 
     int hBins = 50; 
     int sBins = 60; 
     MatOfInt histSize = new MatOfInt(hBins, sBins); 

     // hue varies from 0 to 179, saturation from 0 to 255 
     MatOfFloat ranges = new MatOfFloat(0f,180f,0f,256f); 

     // we compute the histogram from the 0-th and 1-st channels 
     MatOfInt channels = new MatOfInt(0, 1); 



     Mat histRef = new Mat(); 
     Mat histSource = new Mat(); 

     ArrayList<Mat> histImages=new ArrayList<Mat>(); 
     histImages.add(hsvRef); 
     Imgproc.calcHist(histImages, 
       channels, 
       new Mat(), 
       histRef, 
       histSize, 
       ranges, 
       false); 
     Core.normalize(histRef, 
       histRef, 
       0, 
       1, 
       Core.NORM_MINMAX, 
       -1, 
       new Mat()); 

     histImages=new ArrayList<Mat>(); 
     histImages.add(hsvSource); 
     Imgproc.calcHist(histImages, 
       channels, 
       new Mat(), 
       histSource, 
       histSize, 
       ranges, 
       false); 
     Core.normalize(histSource, 
       histSource, 
       0, 
       1, 
       Core.NORM_MINMAX, 
       -1, 
       new Mat()); 

     double resp1 = Imgproc.compareHist(histRef, histSource, 0); 
     double resp2 = Imgproc.compareHist(histRef, histSource, 1); 
     double resp3 = Imgproc.compareHist(histRef, histSource, 2); 
     double resp4 = Imgproc.compareHist(histRef, histSource, 3); 
0

Во-первых, вы должны преобразовать изображение в HSV, используя резюме :: cvtColor преобразовать RGB изображение в HSV изображения, а затем, вы можете использовать резюме :: calcHist для вычисления гистограммы HSV.

Смежные вопросы