简体   繁体   中英

Compare RGB color values of two images in android

To get RGB values of one image i used the follwing code snippet

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;
             }}

I want to compare two images,i know that comparing pixel values would be more expensive.I also analysed OpenCV library but i won't get into my requirement.

Is there any algorithm to compare images using RGB values in android?

or

Is any other method to compare RGB values?

Thanks,

I'm not sure what your requirements are, but if all you want to do is compare the (RGB) color palettes of two images, you might want to use the PaletteFactory methods from Apache Commons Imaging (fka "Sanselan") :

The PaletteFactory methods build up collections ( int[] and List<> ) which can then be iterated over. I'm not sure just what kind of comparison you need to do, but a fairly simple case, using eg makeExactRgbPaletteSimple() , would be:

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 ) )
  }
}

This is just a minimal example which may or may not compile and is almost certainly not what you're looking for in terms of comparison logic .

Basically what it does is check if each member of p1 is also a member of p2 , and if so, adds it to matches . Hopefully the logic is correct, no guarantees. matchPercent is the percentage of colors which exist in both Palette s.

This is probably not the comparison method you want. It is just a simple example.

You will definitely need to play around with the 2nd parameter to makeExactRgbPaletteSimple() , int max , as I chose 256 arbitrarily - remember, the method will (annoyingly, imo) return null if max is too small.

I would suggest building from source as the repos have not been updated for quite some time. The project is definitely not mature, but it is fairly small, reasonably fast for medium-sized images, and pure Java.

Hope this helps.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM