使用RGB图像创建HSV直方图

时间:2010-04-10 06:20:27

标签: java image-processing opencv

Java或OpenCv有没有办法;最好是Java,我可以让HSV直方图给出RGB图像。

我尝试过探索JAI,但它会为RGB图像创建直方图。 谢谢 Harshit

5 个答案:

答案 0 :(得分:2)

使用cv :: cvtColor将RGB转换为HSV 然后使用cv :: calcHist计算直方图

答案 1 :(得分:1)

这是一个简单的RGB到HSV转换器的伪代码。如果颜色是灰色阴影,它将给出UNDEFINED的H,否则H在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直方图的每个bin转换为HSV bin。

答案 2 :(得分:0)

您可以使用“JavaCV”库直接从Java访问OpenCV函数:

http://code.google.com/p/javacv/

然后你可以将我的代码用于RGB到HSV,这比OpenCV的cvConvert函数更好: http://www.shervinemami.co.cc/colorConversion.html

干杯,

Shervin Emami。

答案 3 :(得分: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);

答案 4 :(得分:0)

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