class SsimQa implements Qa<Float, StaticColor> {

    @Override
    public TransientOperation<Float, StaticColor> evaluate(final BufferedImage left, final BufferedImage right) {
        // Convert to SRGB
        BufferedImage leftImg = new SRGBColorConverter(
                new ConvenientBufferedImageWrapper(left)).getImage().getBufferedImage();
        BufferedImage rightImg = new SRGBColorConverter(
                new ConvenientBufferedImageWrapper(right)).getImage().getBufferedImage();

        // Resize
        ShrinkResizePreprocessor shrink = new ShrinkResizePreprocessor(leftImg, rightImg);
        shrink.process();
        leftImg = shrink.getResult1();
        rightImg = shrink.getResult2();
        shrink = null;

        // Scale
        ScaleToNearestFactorPreprocessor scale = new ScaleToNearestFactorPreprocessor(leftImg, rightImg, targetSize);
        scale.process();
        leftImg = scale.getResult1();
        rightImg = scale.getResult2();
        scale = null;

        // Evaluate
        HSBColorConverter c1 = new HSBColorConverter(
                new SRGBColorConverter(new ConvenientBufferedImageWrapper(leftImg)));
        HSBColorConverter c2 = new HSBColorConverter(
                new SRGBColorConverter(new ConvenientBufferedImageWrapper(rightImg)));

        SimpleSSIMMetric metric = new SimpleSSIMMetric(c1, c2, new Point(0, 0),
                                                       new Point(leftImg.getWidth(), leftImg.getHeight()), numThreads);

        // Evaluategi
        return metric.execute();
    }

    public  SsimQa();

}