我正在尝试在集成测试中确定两个图像之间的差异.在网上进行了一些研究之后,我偶然发现了the MarvinProject,并试图用它创建一个UnitTest,请参见下文.
据我了解插件DifferentRegions,它将使用包含差异的区域填充传递的ImageMask DifferenceMask.我通过测试的两个图像确实有所不同,因此应该打印出一些图像.
不幸的是,事实并非如此.
我编写了其他测试,按字节比较了这两个图像,并且测试成功.对于那些想尝试该问题的人,我创建了a repository on GitHub,这里是the 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());
}
解决方法:
插件DifferentRegions是为实时视频处理而开发的.这个想法是找到场景中按视频帧序列变化的区域,如此Example所示
为了进行图像间比较,您应该尝试DifferenceColor插件.基本上,它比较两个图像以分析相同位置的像素的颜色强度.如果两个给定像素的差异高于属性colorRange,则认为这两个像素的颜色不同.该插件以不同的颜色渲染不同的像素,以在输出图像中显示它们.如果在process(…)方法中传递MarvinAttributes对象,则可以获取存储在键合计中的不同像素数.
例:
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,必须按照here的说明配置开发环境.
但是,由于您尝试将图像比较用于单元测试,因此应查看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选项卡中的输出下方.
标签:image-processing,java,marvinproject
来源: https://codeday.me/bug/20191122/2056048.html