使用MarvinFramework比较图像。

4
我正在尝试在一个集成测试中确定两个图像之间的差异。在网上进行了一些研究后,我偶然发现了MarvinProject并尝试用它创建一个单元测试,如下所示。
据我所知,插件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());
}
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"));

注意:为了使用MarvinPluginLoader,您必须按照这里的说明配置开发环境。


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

Output:

However, since you are trying to use image comparison for Unit Testing, you should take a look at MarvinTestCase class. It extends JUnit TestCase and provides methods to compare MarvinImage objects.

enter image description here

下面的源代码实现了两个测试用例,一个比较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选项卡中查看输出。

enter image description here


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接