【问题标题】:Comparing two images using their RGB values. (Java) [closed]使用它们的 RGB 值比较两个图像。 (Java)[关闭]
【发布时间】:2016-01-27 00:03:47
【问题描述】:

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

下面的代码为未过滤和过滤的 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);

谢谢!

编。

【问题讨论】:

  • 你的问题是什么?
  • 当我运行代码时,我得到过滤和未过滤图像的相同 RGB 值。我想知道是否有人能明白为什么?
  • 在上面编辑您的问题,指定您预期会发生什么,以及实际发生了什么
  • 正如我所说,这看起来很可疑- 要正确读取图像,我需要查看 BufferedImage bim=null;试试 { bim=ImageIO.read(new File("c:/..../image.png")); } catch (Exception ex) { System.err.println("bim 中的错误"); ex.printStackTrace(); }
  • @gpasch 说了什么。试试System.out.println(filtered==unfiltered);。如果这打印true,那么:这是你的问题;-)

标签: java image filtering rgb


【解决方案1】:

您在这里所做的是获取图像中心的一个像素的颜色:

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

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

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

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

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

【讨论】:

  • 我以为你修好了! :-( 但我很确定它只是使用原始图像的 RGB 值,我使用了许多图像并且完全相同。我希望可以显示所有代码,因为这是一个相当大的项目。
  • 8 位
【解决方案2】:

您的代码看起来很可疑

 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(); } 

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-05-09
    • 2021-12-31
    • 1970-01-01
    • 2016-10-30
    • 1970-01-01
    • 1970-01-01
    • 2016-02-18
    • 1970-01-01
    相关资源
    最近更新 更多