1

为了获得一张图像的 RGB 值,我使用了以下代码片段

int[] pix = new int[picw * pich];
                 bitmap.getPixels(pix, 0, picw, 0, 0, picw, pich);

                 int R, G, B,Y;

                 for (int y = 0; y < pich; y++){
                 for (int x = 0; x < picw; x++)
                     {
                     int index = y * picw + x;
                     int R = (pix[index] >> 16) & 0xff;     //bitwise shifting
                     int G = (pix[index] >> 8) & 0xff;
                     int B = pix[index] & 0xff;

                     //R,G.B - Red, Green, Blue
                      //to restore the values after RGB modification, use 
     //next statement
                     pix[index] = 0xff000000 | (R << 16) | (G << 8) | B;
             }}

我想比较两个图像,我知道比较像素值会更昂贵。我还分析了 OpenCV 库,但我不会满足我的要求。

是否有任何算法可以在android中使用RGB值比较图像?

或者

还有其他比较RGB值的方法吗?

谢谢,

4

1 回答 1

0

我不确定您的要求是什么,但如果您只想比较两个图像的 (RGB) 调色板,您可能需要使用Apache Commons Imaging (fka "Sanselan")中的PaletteFactory方法:

这些PaletteFactory方法建立了集合 (int[]List<>),然后可以对其进行迭代。我不确定你需要做什么样的比较,但一个相当简单的例子,使用 eg makeExactRgbPaletteSimple(),将是:

final File img1 = new File("path/to/image_1.ext")
final File img2 = new File("path/to/image_2.ext")
final PaletteFactory pf;
final int MAX_COLORS = 256;
final Palette p1 = pf.makeExactRgbPaletteSimple(img1, MAX_COLORS);
final Palette p2 = pf.makeExactRgbPaletteSimple(img2, MAX_COLORS);

final ArrayList<Int> matches = new ArrayList<Int>(Math.max(p1.length(), p2.length()));
int matchPercent;

// Palette objects are pre-sorted, afaik

if ( (p1 != null) && (p2 != null) ) {
  if (p1.length() > p2.length()) {
    for (int i = 0; i < p1.length(); i++) {
      final int c1 = p1.getEntry(i);
      final int c2 = p2.getPaletteIndex(c1);
      if (c2 != -1) {
        matches.add(c1);
      }
    }
    matchPercent = ( (int)( (float)matches.size()) / ((float)p1.length) * 100 ) )
  } else if (p2.length() >= p1.length()) {
    for (int i = 0; i < p1.length(); i++) {
      final int c1 = p2.getEntry(i);
      final int c2 = p1.getPaletteIndex(c1);
      if (c2 != -1) {
        matches.add(c1);
      }
    }
    matchPercent = ( (int)( (float)matches.size()) / ((float)p2.length) * 100 ) )
  }
}

这只是一个最小的例子,它可能编译也可能不编译,而且几乎可以肯定不是你在比较逻辑方面寻找的东西

基本上,它所做的是检查 的每个成员p1是否也是 的成员p2,如果是,则将其添加到matches. 希望逻辑是正确的,不能保证。matchPercent是两个Palettes 中存在的颜色的百分比。

这可能不是您想要的比较方法。这只是一个简单的例子。

您肯定需要使用 , 的第二个参数makeExactRgbPaletteSimple(),因为我任意选择了 256 - 请记住,如果太小int max,该方法将(令人讨厌,imo)返回。nullmax

我建议从源代码构建,因为存储库已经有一段时间没有更新了。该项目绝对不成熟,但它相当小,对于中等大小的图像和纯 Java 来说相当快。

希望这可以帮助。

于 2013-05-23T18:33:00.180 回答