Picture Comparison Code Not Working Properly

Collapse
X
 
  • Time
  • Show
Clear All
new posts
  • UniDue
    New Member
    • Jun 2021
    • 5

    Picture Comparison Code Not Working Properly

    I am still very much a beginner in programming and am facing a problem with a Java code. I would be very thankful for suggestions and comments. The problem is as following:

    I found a Java code online that is designed to compare two pictures and highlight the differences between them. However, the way the code works is by using a loop that compares the RGB value of each pixel of the two pictures and highlights it in a certain color if the value is equal. This however results in a problem that even the slightest shift in camera angle or lighting conditions between the two pictures leads to a different RGB value of the pixels making the code highlight them as a difference even though the pictures are mostly identical. The code is written below and i have added the link to photos showing examples of the outcome of the code. What would you suggest i change in the code? Thank you for your help in advance.

    The code:

    Code:
    import java.awt.image.BufferedImage;
        import java.io.File;
        import java.io.IOException;
         
        import javax.imageio.ImageIO; 
    public class PictureOverlayTest {
        /*
         * Four variables, three for the wanted BufferedImages, one String for the
         * Path of the third Image, which does not already exist.
         */
     
        private BufferedImage image1;
        private BufferedImage image2;
        private BufferedImage image3;
     
        private String pathImage3;
     
        public PictureOverlayTest(String filePathAndName1, String filePathAndName2,
                String filePathAndName3) throws IOException {
            /*
             * Constructor in order to keep this method reusable and clean. Needs
             * three Strings. The paths and Filenames of all three images. Image 1
             * and 2 should exist already, Image 3 will be created if all
             * requirements are met. Constructor creates the first two buffered
             * images, sets all needed variables and starts the checkAndCompare()
             * method
             */
     
            File file = new File(filePathAndName1);
            this.image1 = ImageIO.read(file);
     
            file = new File(filePathAndName2);
            this.image2 = ImageIO.read(file);
     
            this.pathImage3 = filePathAndName3;
            checkAndCompare();
        }
     
        private void checkAndCompare() throws IOException {
            /*
             * This function creates the Color blue, compares the sizes of both
             * pictures and if they are the same, creates a third image. Then it
             * loops through the two images and compares each pixel. If the pixels
             * are the same, the third image gets a blue pixel at that point
             */
     
            Color blue = Color.blue;
            Color yellow = Color.yellow;
     
            if (image1.getHeight() == image2.getHeight()
                    && image1.getWidth() == image2.getWidth()) {
     
                image3 = new BufferedImage(image1.getWidth(), image1.getHeight(),
                        image1.getType());
                for (int y = 0; y < image1.getHeight(); y++) {
                    for (int x = 0; x < image1.getWidth(); x++) {
     
                        int colorImage1 = image1.getRGB(x, y);
                        int colorImage2 = image2.getRGB(x, y);
     
                        if (colorImage1 == colorImage2) {
     
                            image3.setRGB(x, y, blue.getRGB());
     
                        } else {
                                  image3.setRGB(x, y, yellow.getRGB()); 
                            // Whatever Color you want. By default it is black.
     
                        }
     
                    }
                }
                savePicture3();
                System.out.println("Message: Image comparison is done");
     
            } else {
     
                System.out.println("Error: Image dimensions do not match");
     
            }
     
        }
     
        private void savePicture3() throws IOException {
            /*
             * This method saves the created Image into a file onto your computer.
             * The if() statement is used to check if the file was successfully
             * created, in order to avoid unwanted errors. Keep in mind, that you
             * have to change the "bmp" in ImageIO.write() to whatever format you
             * actually want
             */
     
            File file = new File(pathImage3);
            if (file.createNewFile()) {
                ImageIO.write(image3, "bmp", file);
            }
        }
     
    }
    
    import java.io.IOException;
     
    public class Main {
     
        public static void main(String[] args) {
            // TODO Auto-generated method stub
     
            try {
                PictureOverlayTest test = new PictureOverlayTest(
                        "C:\\Users\\Rabee Taha\\Desktop\\Java Test Pics\\test1.png",
                        "C:\\Users\\Rabee Taha\\Desktop\\Java Test Pics\\test2.png",
                        "C:\\Users\\Rabee Taha\\Desktop\\Java Test Pics\\test3.png");
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
     
    }
    Here is the link to example images of the outcome ( https://postimg.cc/gallery/rkXfPr7 )
  • dev7060
    Recognized Expert Contributor
    • Mar 2017
    • 655

    #2
    I am still very much a beginner in programming and am facing a problem with a Java code. I would be very thankful for suggestions and comments. The problem is as following:

    I found a Java code online that is designed to compare two pictures and highlight the differences between them. However, the way the code works is by using a loop that compares the RGB value of each pixel of the two pictures and highlights it in a certain color if the value is equal. This however results in a problem that even the slightest shift in camera angle or lighting conditions between the two pictures leads to a different RGB value of the pixels making the code highlight them as a difference even though the pictures are mostly identical. The code is written below and i have added the link to photos showing examples of the outcome of the code. What would you suggest i change in the code? Thank you for your help in advance.
    You can look into machine learning/artificial intelligence libraries. I believe there would be something related to image processing that could serve the purpose.

    Comment

    Working...