4

我试图在集成测试期间确定两个图像之间的差异。在网上做了一些研究之后,我偶然发现了MarvinProject并尝试用它创建一个 UnitTest,见下文。

据我了解插件DifferentRegions,它将ImageMask differenceMask用包含差异的区域填充传递。我通过测试的两张图片确实不同,所以它应该打印出一些东西。

不幸的是,它没有。

我已经编写了其他测试来逐字节比较这两个图像并且这些测试成功了。对于那些想尝试这个问题的人,我在 GitHub 上创建了一个存储库,这里是ImageCompareTest

@Test
public void tryMarvinProject() {
    // init images
    String root = "src/test/resources/";
    MarvinImage assertedImg = MarvinImageIO.loadImage(root + "image1.bmp");
    MarvinImage actualImg = MarvinImageIO.loadImage(root + "image2.bmp");

    // init diff-regions plugin
    DifferentRegions regions = new DifferentRegions();
    regions.load();
    regions.setAttribute("comparisonImage", assertedImg);

    int width = assertedImg.getWidth();
    int height = assertedImg.getHeight();
    int type = assertedImg.getType();

    // process the images and retrieve differences from the ImageMask
    MarvinImageMask differenceMask = new MarvinImageMask();
    regions.process(
            actualImg,
            new MarvinImage(new BufferedImage(width, height, type)),
            new MarvinAttributes(),
            differenceMask,
            false);

    // should contain the differences, but does not
    System.out.println(differenceMask.getMaskArray());
    assertNotNull(differenceMask.getMaskArray());
}
4

1 回答 1

4

插件 DifferentRegions 是为实时视频处理而开发的。这个想法是找到场景中在一系列视频帧中发生变化的区域,如本例所示

对于图像到图像的比较,您应该尝试使用DifferenceColor插件。基本上,它比较两个图像,分析同一位置像素的颜色强度。如果两个给定像素的差异高于属性colorRange,则认为这两个像素的颜色不同。该插件以不同的颜色渲染不同的像素,以在输出图像中显示它们。如果您在process(...)方法中传递一个MarvinAttributes对象,您可以获得不同像素的数量,存储在键total中。

例子:

    MarvinAttributes attrOut = new MarvinAttributes();
    MarvinImagePlugin diff = MarvinPluginLoader.loadImagePlugin("org.marvinproject.image.difference.differenceColor");
    diff.process(imageA, imageB, attrOut);
    System.out.println("Distinct pixels:"+attrOut.get("total"));

PS:要使用MarvinPluginLoader ,您必须按照此处提供的说明配置开发环境。


但是,由于您尝试使用图像比较进行单元测试,您应该看看MarvinTestCase类。它扩展了JUnit TestCase 并提供了比较 MarvinImage 对象的方法。

输入:

在此处输入图像描述

下面的源代码实现了两个测试用例,一个比较 imageA 和 imageB,另一个比较 imageA 和 imageC。

import marvin.image.MarvinImage;
import marvin.io.MarvinImageIO;
import marvin.test.MarvinTestCase;

public class UnitTesting extends MarvinTestCase {

    private MarvinImage imageA, imageB, imageC;

    public UnitTesting(){
        imageA = MarvinImageIO.loadImage("./res/penguin.jpg");
        imageB = MarvinImageIO.loadImage("./res/penguin.jpg");
        imageC = MarvinImageIO.loadImage("./res/penguin_dark.jpg");
    }

    public void testSameImage(){
        assertEquals(imageA, imageB);
    }

    public void testDistinctImages(){
        assertEquals(imageA, imageC);
    }
}

使用 Eclipse 或其他 IDE,将上面的类作为 JUnit 测试运行。在 Eclipse 上的 JUnit 选项卡中的输出下方。

在此处输入图像描述

于 2014-03-15T16:10:19.297 回答