个性化阅读
专注于IT技术分析

Java中的图像处理S14(两个图像的比较)

我们强烈建议你参考以下帖子, 以此作为前提。

  • Java中的图像处理S1(读和写)
  • Java中的图像处理S2(获取并设置像素)

在本文中, 我们将学习如何比较两个给定的图像(必须具有相同的尺寸)并打印它们之间的差异百分比。

算法:

步骤1 –检查两个图像的尺寸是否匹配。

步骤2 –获取两个图像的RGB值。

步骤3 –计算三个颜色分量的两个相应像素中的差异。

步骤4 –对图像的每个像素重复步骤2-3。

步骤5 –通过将差异之和除以计算百分比:

  • 像素数, 以获得每个像素的平均差
  • 3, 获得每个颜色成分的平均差
  • 255, 以获得介于0.0和1.0之间的值, 该值可以转换为百分比值

实现

//Java Program to compare two images
import java.awt.image.BufferedImage;
import javax.imageio.ImageIO;
import java.io.File;
import java.io.IOException;
  
class ImageComparision
{
     public static void main(String[] args)
     {
         BufferedImage imgA = null ;
         BufferedImage imgB = null ;
  
         try
         {
             File fileA = new File( "/home /pratik /" +
                              " Desktop /image1.jpg" );
             File fileB = new File( "/home /pratik /" +
                              " Desktop /image2.jpg" );
  
             imgA = ImageIO.read(fileA);
             imgB = ImageIO.read(fileB);
         }
         catch (IOException e)
         {
             System.out.println(e);
         }
         int width1 = imgA.getWidth();
         int width2 = imgB.getWidth();
         int height1 = imgA.getHeight();
         int height2 = imgB.getHeight();
  
         if ((width1 != width2) || (height1 != height2))
             System.out.println( "Error: Images dimensions" +
                                              " mismatch" );
         else
         {
             long difference = 0 ;
             for ( int y = 0 ; y <height1; y++)
             {
                 for ( int x = 0 ; x <width1; x++)
                 {
                     int rgbA = imgA.getRGB(x, y);
                     int rgbB = imgB.getRGB(x, y);
                     int redA = (rgbA>> 16 ) & 0xff ;
                     int greenA = (rgbA>> 8 ) & 0xff ;
                     int blueA = (rgbA) & 0xff ;
                     int redB = (rgbB>> 16 ) & 0xff ;
                     int greenB = (rgbB>> 8 ) & 0xff ;
                     int blueB = (rgbB) & 0xff ;
                     difference += Math.abs(redA - redB);
                     difference += Math.abs(greenA - greenB);
                     difference += Math.abs(blueA - blueB);
                 }
             }
  
             //Total number of red pixels = width * height
             //Total number of blue pixels = width * height
             //Total number of green pixels = width * height
             //So total number of pixels = width * height * 3
             double total_pixels = width1 * height1 * 3 ;
  
             //Normalizing the value of different pixels
             //for accuracy(average pixels per color
             //component)
             double avg_different_pixels = difference /
                                           total_pixels;
  
             //There are 255 values of pixels in total
             double percentage = (avg_different_pixels /
                                             255 ) * 100 ;
  
             System.out.println( "Difference Percentage-->" +
                                                 percentage);
         }
     }
}

注意:代码将无法在在线IDE上运行, 因为它需要驱动器中的映像。

输出如下:

输入图像:

Java中的图像处理S14(两个图像的比较)1
Java中的图像处理S14(两个图像的比较)2

输出:差异百分比–> 2.843600130405922

输入图像:

Java中的图像处理S14(两个图像的比较)3
Java中的图像处理S14(两个图像的比较)4

输出:差异百分比–> 6.471412648669786

输入图像:

Java中的图像处理S14(两个图像的比较)5
Java中的图像处理S14(两个图像的比较)6

输出:差异百分比–> 0.0

如果发现任何不正确的地方, 或者想分享有关上述主题的更多信息, 请写评论。

赞(0) 打赏
未经允许不得转载:srcmini » Java中的图像处理S14(两个图像的比较)
分享到: 更多 (0)

评论 抢沙发

评论前必须登录!

 

觉得文章有用就打赏一下文章作者

微信扫一扫打赏