Package at.tuwien.minimee.migration.evaluators

Source Code of at.tuwien.minimee.migration.evaluators.ImageCompareEvaluator

/*******************************************************************************
* Copyright (c) 2006-2010 Vienna University of Technology,
* Department of Software Technology and Interactive Systems
*
* All rights reserved. This program and the accompanying
* materials are made available under the terms of the
* Apache License, Version 2.0 which accompanies
* this distribution, and is available at
* http://www.apache.org/licenses/LICENSE-2.0
*******************************************************************************/
package at.tuwien.minimee.migration.evaluators;

import java.io.File;
import java.util.ArrayList;
import java.util.List;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

import eu.planets_project.pp.plato.model.measurement.Measurement;
import eu.planets_project.pp.plato.model.scales.Scale;
import eu.planets_project.pp.plato.util.CommandExecutor;
import eu.planets_project.pp.plato.util.OS;

/**
* This evaluator uses the ImageMagick COMPARE script to measure the difference
* of two images. For this, ImageMagick must be defined properly!
* That means, you need to set the IMAGEMAGICK_HOME environment variable
* to point to your installation directory.
* @author cb
*
*/
public class ImageCompareEvaluator implements IMinimeeEvaluator {
    private String name;
    private Log log = LogFactory.getLog(this.getClass().getName());
    private String compareCommand = "%IMAGEMAGICK_HOME%/compare %FILE1% %FILE2% -metric %METRIC% tempimagefile";

    private String IMAGEMAGICK_HOME;
   
    /**
     * @throws IllegalStateException if IMAGEMAGICK_HOME is not set
     */
    public ImageCompareEvaluator()  {
        IMAGEMAGICK_HOME = System.getenv("IMAGEMAGICK_HOME");
       
        //
        // IMAGEMAGICK_HOME is set and the directory exists
        if (IMAGEMAGICK_HOME != null && new File(IMAGEMAGICK_HOME).exists()) {
            compareCommand = compareCommand.replace("%IMAGEMAGICK_HOME%", new File(IMAGEMAGICK_HOME).getAbsolutePath());
           
            return;
        //
        // IMAGEMAGICK_HOME is not set, but the operating system is Linux and the ImageMagick is installed
        } else if (IMAGEMAGICK_HOME == null && ("Linux".compareTo(System.getProperty("os.name")) == 0)
                && new File("/usr/bin/compare").exists()) {
            compareCommand = compareCommand.replace("%IMAGEMAGICK_HOME%", "/usr/bin");
           
            return;
        }
       
        //
        // in all other cases, where IMAGEMAGICK_HOME is not set, we throw an exception.
        if (IMAGEMAGICK_HOME == null) {
            throw new IllegalStateException("ImageMagick is not propertly configured - IMAGEMAGICK_HOME is not defined.");
        }
    }
   
    public List<Measurement> evaluate(String tempDir, String file1,String file2) {
        List<Measurement> list = new ArrayList<Measurement>();
        String[] metrics = new String[] { // see http://www.imagemagick.org/Usage/compare/#statistics
                "AE",   // Absolute Error count of the number of different pixels (0=equal)
                "PAE"// Peak Absolute Error
                "PSNR", // Peak Signal to noise ratio
                "MAE"// Mean absolute error    (average channel error distance)
                "MSE"// Mean squared error     (averaged squared error distance)
                "RMSE", //  (sq)root mean squared error -- IE:  sqrt(MSE)
                "MEPP" // Normalized Mean Error AND Normalized Maximum Error
        };
       
        for (String metric: metrics) {
            Double value = evaluate(tempDir,file1,file2,metric);
            list.add(new Measurement("imagequality:"+metric,value));
       }
        return list;
    }
   
    public Double evaluate(String tempDir, String file1,String file2, String metric) {
        String commandTemplate = compareCommand.replace("%FILE1%", file1)
                                               .replace("%FILE2%", file2);
       
        CommandExecutor cmdEx = new CommandExecutor();
        cmdEx.setWorkingDirectory(OS.getTmpPath());
        String command = commandTemplate.replace("%METRIC%", metric);
        try {
            cmdEx.runCommand(command);
            String out = cmdEx.getCommandError();
            log.debug(command+ " == "+out);
            Double value = Scale.MAX_VALUE;

            try {
                if (out.contains(" ")) {
                    out = out.substring(0,out.indexOf(" "));
                }
                value = Double.valueOf(out.trim());
            } catch (NumberFormatException e) {
                log.error("unknown numberformat: "+out+" "+e.getMessage());
            }
            return value;
        } catch (Exception e) {
            log.error("error during image comparison "+command+" : "+cmdEx.getCommandError(),e);
            return null;
        }
    }

    /**
     * unused
     */
    public String getConfigParam() {
        return null;
    }

    /**
     * unused
     */
    public void setConfigParam(String configParam) {
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

}
TOP

Related Classes of at.tuwien.minimee.migration.evaluators.ImageCompareEvaluator

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.