用Java修改和比较2个图像

时间:2015-04-09 06:45:16

标签: java image-processing

我有一个我需要验证图像的作业。我有2套文件夹,一套是实际的,其他文件夹包含预期的图像。这些图片来自某些品牌/公司。

经过初步调查,我发现每个品牌的图像都有不同的尺寸,但格式相同,即png

到目前为止我做了什么: - 谷歌上搜索我发现下面的代码比较了2张图片。我为其中一个品牌运行此代码,结果是错误的。然后我修改其中一个图像,使两个图像具有相同的尺寸..即使这样我得到了相同的结果。

public void testImage() throws InterruptedException{
        String file1="D:\\image\\bliss_url_2.png";
        String file2="D:\\bliss.png";
        Image image1 = Toolkit.getDefaultToolkit().getImage(file1);
        Image image2 = Toolkit.getDefaultToolkit().getImage(file2);

        PixelGrabber grab1 =new PixelGrabber(image1, 0, 0, -1, -1, true);
        PixelGrabber grab2 =new PixelGrabber(image2, 0, 0, -1, -1, true);



        int[] data1 = null;

        if (grab1.grabPixels()) {
        int width = grab1.getWidth();
        int height = grab1.getHeight();
        System.out.println("Initial width and height of Image 1:: "+width + ">>"+ height);
        grab2.setDimensions(250, 100);
        System.out.println("width and height of Image 1:: "+width + ">>"+ height);
        data1 = new int[width * height];
        data1 = (int[]) grab1.getPixels();
        System.out.println("Image 1:: "+ data1);
        }

        int[] data2 = null;

        if (grab2.grabPixels()) {
        int width = grab2.getWidth();
        int height = grab2.getHeight();
        System.out.println("width and height of Image 2:: "+width + ">>"+ height);
        data2 = new int[width * height];
        data2 = (int[]) grab2.getPixels();
        System.out.println("Image 2:: "+ data2.toString());
        }

        System.out.println("Pixels equal: " + java.util.Arrays.equals(data1, data2));
    }

我只想验证图像的内容是否相同,即图像是否属于同一品牌,如果没有那么差异是什么

请帮助我如何进行有效比较。

2 个答案:

答案 0 :(得分:1)

也许你不应该使用一些外部库,假设它应该是你自己的工作。从这个角度来看,比较图像的方法是获得两个图像的相同部分的平均颜色。如果结果相等(或由于压缩错误等而非常相似)

让我们说我们有两张照片 图像1是4像素。 (为了简化每个像素用数字表示,但应该是RGB)

1 2
3 4

[(1 + 2 + 3 + 4)/ 4 = 2.5]

图像2是两倍大

1 1 2 2
1 1 2 2
3 3 4 4
3 3 4 4

[((4 * 1)+(4 * 2)+(4 * 3)+(4 * 4))/ 16 = 2.5]

两幅图像的平均像素值(颜色)均为2.5。 (使用真实像素颜色,分别比较RGB颜色。三者应相等或非常接近)

这个想法。现在,您应该对最小图像的每个像素和最大图像的相应像素(根据两个图像的比例差异)进行此分析

希望你能找到一个好的解决方案!

答案 1 :(得分:0)

  1. 方法setDimensions不会缩放图像。而且,你不应该直接调用它(参见它的java-doc)。 PixelGrabber只是一个抓取图像中像素子集的抓取器。要缩放图像,请使用Image.getScaledInstance()http://docs.oracle.com/javase/7/docs/api/java/awt/Image.html#getScaledInstance(int,%20int,%20int)例如

  2. 即使你在缩放后有2张相同大小的图像,你仍然无法逐像素地比较它们,因为任何缩放算法本质上都是有损的。这意味着你唯一能做的就是检查"相似性"的图像。我建议看看一个很棒的图像处理库OpenCV,它有一个Java包装器:

  3. Simple and fast method to compare images for similarity

    http://docs.opencv.org/doc/tutorials/introduction/desktop_java/java_dev_intro.html