使用它们的 RGB 值比较两个图像。 (Java)
Comparing two images using their RGB values. (Java)
我正在尝试使用它们的 RGB 值比较两个图像。
下面的代码为未过滤和过滤后的图像提取相同的 RGB 值。我希望两个图像的值不同。 (未过滤和过滤是先前定义的)。这个想法是,两幅图像(过滤前后)之间的差异越大,过滤后的图像就越差。
作为我的结果,我希望有两组不同的 RGB 值(1 个用于未过滤,1 个用于过滤)。我得到了两组 RGB 值,但是它们是相同的。
我正在创建一个色盲模拟器,想比较两者的值。下面是 "Normal" 视觉图像和 "Colour Blind" 视觉图像的示例。
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);
谢谢!
Ed.
您在这里所做的是为图像中心的一个像素取色:
Color unfilteredRGBValue = new Color(unfiltered.getRGB(ufwidth / 2, ufheight / 2))
如果我们查看 getRGB()
方法的 javadoc,它会显示
There are only 8-bits of precision for each color component in the returned data when using this method.
我认为 8 位是一个非常小的精度,因为 jpeg 格式的标准 RGB 图像每个像素有 24 位。可能你的两张图片中间的像素不是很明显。
编辑:正如迈克尔在下面提到的,它是每种颜色的精确度,所以应该足够了。
无论如何,仅通过一个像素来比较图像并不是一个好主意,最好采用一些显着数量的像素并计算它们的差异的均值或平均值。
您的代码看起来可疑
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(); }
我正在尝试使用它们的 RGB 值比较两个图像。
下面的代码为未过滤和过滤后的图像提取相同的 RGB 值。我希望两个图像的值不同。 (未过滤和过滤是先前定义的)。这个想法是,两幅图像(过滤前后)之间的差异越大,过滤后的图像就越差。
作为我的结果,我希望有两组不同的 RGB 值(1 个用于未过滤,1 个用于过滤)。我得到了两组 RGB 值,但是它们是相同的。
我正在创建一个色盲模拟器,想比较两者的值。下面是 "Normal" 视觉图像和 "Colour Blind" 视觉图像的示例。
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);
谢谢!
Ed.
您在这里所做的是为图像中心的一个像素取色:
Color unfilteredRGBValue = new Color(unfiltered.getRGB(ufwidth / 2, ufheight / 2))
如果我们查看 getRGB()
方法的 javadoc,它会显示
There are only 8-bits of precision for each color component in the returned data when using this method.
我认为 8 位是一个非常小的精度,因为 jpeg 格式的标准 RGB 图像每个像素有 24 位。可能你的两张图片中间的像素不是很明显。
编辑:正如迈克尔在下面提到的,它是每种颜色的精确度,所以应该足够了。 无论如何,仅通过一个像素来比较图像并不是一个好主意,最好采用一些显着数量的像素并计算它们的差异的均值或平均值。
您的代码看起来可疑
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(); }