【问题标题】:how to compare set of images in java using pixel based image comparision metric based on mean squared error?java - 如何使用基于均方误差的基于像素的图像比较度量来比较Java中的图像集?
【发布时间】:2022-05-06 19:01:49
【问题描述】:

在我的项目中,我有一组图像。我需要比较它们。将一张图像的每个像素与数据集中所有其他图像中相同位置的像素进行比较。在对图像空间中的所有像素应用均方误差计算之后,识别出一组不同的像素,它们代表图像中具有不同颜色值的像素。 我已经比较并在一个文件中存储了两个图像的相似性像素。但不能对 12 个图像执行此操作。'code'

import java.io.*;
import java.awt.*;
import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
class spe
{
    public static void main(String args[]) 
    throws IOException
    {
        long start = System.currentTimeMillis();
        int q=0;
            File file1 = new File("filename.txt");

        /* if file doesnt exists, then create it
        if (!file.exists()) {
                    file.createNewFile();
                }*/
        FileWriter fw = new FileWriter(file1.getAbsoluteFile());
        BufferedWriter bw = new BufferedWriter(fw);

                File file= new File("2000.png");
            BufferedImage image = ImageIO.read(file);
        int width = image.getWidth(null);
            int height = image.getHeight(null);
        int[][] clr=  new int[width][height]; 
        File files= new File("2002.png");
            BufferedImage images = ImageIO.read(files);
        int widthe = images.getWidth(null);
            int heighte = images.getHeight(null);
        int[][] clre=  new int[widthe][heighte]; 
        int smw=0;
        int smh=0;
        int p=0;
            //CALUCLATING THE SMALLEST VALUE AMONG WIDTH AND HEIGHT
            if(width>widthe)
            { 
                smw =widthe;
            }
            else 
            {
                smw=width;
            }
            if(height>heighte)
            {
                smh=heighte;
            }
            else 
            {
                smh=height;
            }
            //CHECKING NUMBER OF PIXELS SIMILARITY
            for(int a=0;a<smw;a++)
            {
                for(int b=0;b<smh;b++)
                {
                    clre[a][b]=images.getRGB(a,b);
                    clr[a][b]=image.getRGB(a,b);
                    if(clr[a][b]==clre[a][b]) 
                    {
                        p=p+1;
                        bw.write("\t");
                         bw.write(Integer.toString(a));
                        bw.write("\t");
                         bw.write(Integer.toString(b)); 
                        bw.write("\n");
                    }
                    else
                        q=q+1;
                }
            }

    float w,h=0;
    if(width>widthe) 
    {
        w=width;
    }
    else 
    {
        w=widthe;
    }
    if(height>heighte)
    { 
        h = height;
    }
    else
    {
        h = heighte;
    }
    float s = (smw*smh);
    //CALUCLATING PERCENTAGE
    float x =(100*p)/s;

    System.out.println("THE PERCENTAGE SIMILARITY IS APPROXIMATELY ="+x+"%");
    long stop = System.currentTimeMillis();
    System.out.println("TIME TAKEN IS ="+(stop-start));
    System.out.println("NO OF PIXEL GETS VARIED:="+q);
    System.out.println("NO OF PIXEL GETS MATCHED:="+p);
  }
}

【问题讨论】:

  • 请写出你到目前为止做了什么??
  • 我从 url 获得了 png 图像作为输入。
  • 但是为了比较你写过什么代码吗?如果是的话,请放在这里

标签: java image-processing


【解决方案1】:

您可以使用Catalano Framework 进行操作。有几个指标可以比较图像,包括均方误差。

例子:

FastBitmap original = new FastBitmap(bufferedImage1);
FastBitmap reconstructed = new FastBitmap(bufferedImage2);

ObjectiveFidelity o = new ObjectiveFidelity(original, reconstructed);

// Error total
int error = o.getTotalError();

//Mean Square Error
double mse = o.getMSE();

//Signal Noise Ratio
double snr = o.getSNR();

//Peak Signal Noise Ratio
double psnr = o.getPSNR();

所有这些指标都基于以下书籍:计算机成像:数字图像分析和处理 - Scott E Umbaugh。

下一个版本 (1.3) 将包含Derivative SNR

【讨论】:

  • 如果此答案抛出 NPExceptions,则您的图像具有非灰色颜色模型,您需要使用 FastBitmap 上的各种 toXXX 方法对其进行转换 [例如toARGB() 然后 toGrayscale()]
  • @Diego Catalano,把 dube 的评论放在你的回答中。
【解决方案2】:

现在您的代码将始终将文件 2000.png 与 2002.png 进行比较。 首先将您的比较代码重构为一个方法:

CompareResult compare(BufferedImage  img1,BufferedImage  img2) { ... }

声明一个类 CompareResult 以将结果信息分组到一个消息中:

class CompareResult {
     long pixMatched;
     long pixVar;
     ...
}

然后从命令行获取图像文件列表并将它们相互压缩:

for(int i=0;i<args.length();i++) {
    BufferedImage img1 = ImageIO.read(args[i]);
    for (int j=i+1;j<args.length();j++) {
        BufferedImage img2 = ImageIO.read(args[j]);
        CompareResult r = compare(img1,img2);
        printInfo(r);
    }
}

【讨论】:

    【解决方案3】:
      File file1 = new File(args[0]);
      File file2 = new File(args[1]);
    
      boolean compareResult = FileUtils.contentEquals(file1, file2);
      System.out.println("Are the files are same? " + compareResult);
    

    用于执行此比较的 Apache Commons IO 库(下载 commons-io-2.4.jar)

    【讨论】:

    • 如果像素彼此相距一定距离,这可能不起作用。访问实际像素时,您可以计算像素到另一个像素的颜色距离,并使用接受阈值来匹配两者。就像,较浅的红色阴影与较深的红色阴影。两种颜色的红色通道都大于绿色和蓝色。
    猜你喜欢
    • 2012-11-18
    • 2012-01-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-09
    相关资源
    最近更新 更多