代码之家  ›  专栏  ›  技术社区  ›  eamuldowne

使用RGB值比较两个图像。(Java)[已关闭]

  •  1
  • eamuldowne  · 技术社区  · 10 年前

    我正在尝试使用RGB值比较两个图像。

    下面的代码将提取未过滤和过滤的RGB值。我希望两幅图像的值不同。(先前定义了未过滤和过滤)。其思想是,两幅图像之间的差异(滤波前后)越大,滤波后的图像越差。

    因此,我希望有两组不同的RGB值(1表示未过滤,1表示过滤)。然而,我得到了两组RGB值,它们都是相同的。

    我正在创建一个色盲模拟器,想比较两者的值。以下是“正常”视觉图像和“色盲”视觉图像的示例。

    Unfiltered Image | Filtered Image

    filteredImage = unfilteredImage = Img;
    

    ...

    ImageDisplay = new JLabel(new ImageIcon(filteredImage));
    

    ...

    private void TypeButtonPressed()
    {
        filteredImage(GetType());
    }
    

    ...

    int GetType()
    {
        int type = 0;
        for (int i=0; i<numberOfTypes; i++)
        {
            JToggleButton TypeButton = TypeButtons[i];
            if (TypeButton.isSelected()) type = i;
        }
    
        TypeListener.SetType(type);
        return type;
    }
    

    ...

            BufferedImage unfiltered = unfilteredImage;
            BufferedImage filtered = filteredImage;
    
            //unfilteredImage
            int ufwidth = unfiltered.getWidth();
            int ufheight = unfiltered.getHeight();
    
            Color unfilteredRGBValue = new Color(unfiltered.getRGB(ufwidth / 2, ufheight / 2));
    
            int ufred = unfilteredRGBValue.getRed();
            int ufgreen = unfilteredRGBValue.getGreen();
            int ufblue = unfilteredRGBValue.getBlue();
    
            System.out.println("Unfiltered Red: " + ufred);
            System.out.println("Unfiltered Green: " + ufgreen);
            System.out.println("Unfiltered Blue: " + ufblue);
    
            System.out.println("Unfiltered Score: " + ufred + ufgreen + ufblue);
    
            //filteredImage
            int fwidth = filtered.getWidth();
            int fheight = filtered.getHeight();
    
            Color filteredRGBValue = new Color(filtered.getRGB(fwidth / 2, fheight / 2));
    
            int fred = filteredRGBValue.getRed();
            int fgreen = filteredRGBValue.getGreen();
            int fblue = filteredRGBValue.getBlue();
    
            System.out.println("Filtered Red: " + fred);
            System.out.println("Filtered Green: " + fgreen);
            System.out.println("Filtered Blue: " + fblue);
    
            System.out.println("Filtered Score: " + fred + fgreen + fblue);
    

    非常感谢。

    预计起飞时间。

    2 回复  |  直到 10 年前
        1
  •  1
  •   Dmitry P.    10 年前

    你在这里要做的是为图像中心的一个像素取一个颜色:

    Color unfilteredRGBValue = new Color(unfiltered.getRGB(ufwidth / 2, ufheight / 2))
    

    如果我们查看javadoc getRGB() 方法,它说

    使用此方法时,返回数据中的每个颜色分量只有8位精度。

    我认为8位是一个相当小的精度,因为jpeg格式的标准RGB图像每像素有24位。可能你的两张图片中间的像素并不是那么明显。

    编辑:正如迈克尔在下面提到的,这是每种颜色的精度,所以应该足够。 无论如何,仅通过一个像素来比较图像不是一个好主意,最好取一些重要的像素并计算它们的差异的平均值或平均值。

        2
  •  1
  •   gpasch    10 年前

    你的代码看起来可疑

     filteredImage = unfilteredImage = Img; 
    

    为了正确读取图像,我需要看到

    BufferedImage bim1=null, bim2=null;
    try {
      bim1=ImageIO.read(new File("c:/..../image1.png"));
      bim2=ImageIO.read(new File("c:/..../image2.png"));
    }
    catch (Exception ex) { ex.printStackTrace(); }