Сравните изображения с MarvinFramework
Я пытаюсь определить различия между двумя изображениями во время интеграционного теста. Проведя некоторые исследования в Интернете, я наткнулся на 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());
}
1 ответ
Плагин DifferentRegions был разработан для обработки видео в реальном времени. Идея состоит в том, чтобы найти области в сцене, которые меняются в последовательности видеокадров, как показано в этом примере.
Для сравнения между изображениями, вы должны попробовать плагин DifferenceColor. По сути, он сравнивает два изображения, анализируя интенсивность цвета пикселей в одной и той же позиции. Если разность двух данных пикселей выше, чем атрибут colorRange, два пикселя считаются разными по цвету. Плагин отображает разные пиксели в разные цвета, чтобы показать их в выходном изображении. Если вы передадите объект MarvinAttributes в методе process (...), вы можете получить количество различных пикселей, сохраненных в итоговой сумме.
Пример:
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. Ниже вывода на вкладке JUnit в Eclipse.