【问题标题】:image comparison in java [closed]java中的图像比较[关闭]
【发布时间】:2011-09-03 09:10:10
【问题描述】:

我正在做我的大学项目,在该项目中我需要进行指纹比较。这可以通过比较两个图像并匹配它们的像素相似性来完成(根据我的发现)。

是否有任何 API/库/SDK 或 Java 中可用的任何东西,用于比较两个图像并获得它们之间的百分比匹配?

【问题讨论】:

  • 我不知道任何API,但是您只是想比较每个像素的像素颜色并获得平均差异吗?
  • 使用像素比较两张图片并获取它们之间的相似度

标签: java api image-processing sdk


【解决方案1】:

查看OpenCV 库。 你可以在那里找到你需要的东西。以here 为例,了解如何比较图像。

【讨论】:

    【解决方案2】:

    这样的东西对你有用吗?注释行可能不太正确。

    int numberOfPixels = 0;
    float runningTotal = 0;    
    for (int i = 0; i < image.width; i++)
    {
        for (int j = 0; j < image.height; j++)
        {
            //Color a = image1.getPixel(i, j);
            //Color b = image2.getPixel(i, j);
    
            float differenceRed = abs(a.red() - b.red()) / 255;
            float differenceGreen = abs(a.green() - b.green()) / 255;
            float differenceBlue = abs(a.blue() - b.blue()) / 255;
    
            float differenceForThisPixel = (differenceRed + differenceGreen + differenceBlue) / 3;
            runningTotal += differenceForThisPixel;
            numberOfPixels++;
    
        }
    }
    averageDifference = (runningTotal / numberOfPixels);
    

    【讨论】:

    • 在某些情况下使用此方法可以完成工作,但是在大多数情况下还不够。图像相似度不是通过像素到像素的比较来衡量的;它应该涉及图案比较、阴影比较、对比度比较等。我希望生活就这么简单:-)
    【解决方案3】:

    图像相似度

    比较两个BufferedImage 像素与pixel 并显示相似度。图片尺寸(宽度/高度)必须相同。

     public static double similarity( BufferedImage image1, BufferedImage image2 ) throws IOException{
             int total_no_ofPixels = 0;      
             int image1_PixelColor, red, blue, green;
             int image2_PixelColor, red2, blue2, green2;
             float differenceRed, differenceGreen, differenceBlue, differenceForThisPixel;
             double nonSimilarPixels = 0l, non_Similarity = 0l;
    
             long startTime = System.nanoTime();
    // A digital image is a rectangular grid of pixels, Dimensions with/Height = 1366/728 pixels.        
    // Colours are usually expressed in terms of a combination of red, green and blue values.        
             for (int row = 0; row < image1.getWidth(); row++) {
                for (int column = 0; column < image1.getHeight(); column++) {
                      image1_PixelColor   =  image1.getRGB(row, column);                
                      red                 = (image1_PixelColor & 0x00ff0000) >> 16;
                      green               = (image1_PixelColor & 0x0000ff00) >> 8;
                      blue                =  image1_PixelColor & 0x000000ff;
    
                      image2_PixelColor   =  image2.getRGB(row, column);                
                      red2                = (image2_PixelColor & 0x00ff0000) >> 16;
                      green2              = (image2_PixelColor & 0x0000ff00) >> 8;
                      blue2               =  image2_PixelColor & 0x000000ff;
    
                            if (red != red2 || green != green2 || blue != blue2) {
                                differenceRed   =  red - red2 / 255;
                                differenceGreen = ( green - green2 ) / 255;
                                differenceBlue  = ( blue - blue2 ) / 255;
                                differenceForThisPixel = ( differenceRed + differenceGreen + differenceBlue ) / 3;
                                nonSimilarPixels += differenceForThisPixel;
                            }
                     total_no_ofPixels++;
    
                     if ( image1_PixelColor != image2_PixelColor ) {
                         image2.setRGB(row, column, Color.green.getGreen());
                     }
                }
            }
             long endTime = System.nanoTime();
             System.out.println(String.format( "%-2d: %s", 0, toString( endTime - startTime )));
    
             System.out.println(" Writing the difference of first_Image to Second_Image ");
             ImageIO.write(image2, "jpeg", new File("D:\\image2.png"));
    
             non_Similarity = (nonSimilarPixels / total_no_ofPixels);
             System.out.println( "Total No of pixels : " + total_no_ofPixels +"\t Non Similarity is : " + non_Similarity +"%");
    
             return non_Similarity;          
         }
         private static String toString(long nanoSecs) {
              int minutes    = (int) ( nanoSecs / 60000000000.0 );
              int seconds    = (int) ( nanoSecs / 1000000000.0 )  - ( minutes * 60 );
              int millisecs  = (int) ( (( nanoSecs / 1000000000.0 ) - ( seconds + minutes * 60 )) * 1000 );
    
              if      ( minutes == 0 && seconds == 0   )    return millisecs + "ms";
              else if ( minutes == 0 && millisecs == 0 )    return seconds + "s";
              else if ( seconds == 0 && millisecs == 0 )    return minutes + "min";
              else if ( minutes == 0                   )    return seconds + "s " + millisecs + "ms";
              else if ( seconds == 0                   )    return minutes + "min " + millisecs + "ms";
              else if ( millisecs == 0                 )    return minutes + "min " + seconds + "s";
    
              return minutes + "min " + seconds + "s " + millisecs + "ms";
           }
    

    James Webster 帖子的简要说明

    【讨论】:

    • 小改进:差异写成“jpeg”不太好找像素写成绿色,用“png”更好。
    猜你喜欢
    • 2016-10-30
    • 2018-08-02
    • 1970-01-01
    • 2021-12-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多