2010-04-10 81 views
0

在Java或OpenCv中有没有办法;最好是Java,我可以有一个HSV直方图给RGB图像。使用RGB图像创建HSV直方图

我试着探索JAI,但它创建RGB图像的直方图。 谢谢 Harshit

回答

1

这里是一个简单的RGB到HSV转换器的伪代码。它会给UNDEFINED一个h如果颜色是灰色的阴影,否则H为6介于0和

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直方图的每个bin转换为HSV bin。

2

冷杉使用CV :: cvtColor将RGB转换为HSV 然后用CV :: 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

首先,你必须使用CV :: cvtColor为RGB图像转换成HSV图像,然后将图像转换为HSV,您可以使用CV :: calcHist来计算HSV直方图。