cv :: detail :: MultiBandBlender странные белые полосы в конце фото - PullRequest
0 голосов
/ 09 января 2020

Я работаю с OpenCV 3.4.8 с C ++ 11 и пытаюсь смешать изображения вместе. В этом примере у меня есть 2 изображения (их маска показана на экране ниже). У меня есть географическая привязка, поэтому я могу легко рассчитать углы этих изображений в конечном изображении. Данные вне масок черные.

Masks of the images before blending

Мой код выглядит примерно так:

std::vector<cv::UMat> inputImages;
std::vector<cv::UMat> masks;
std::vector<cv::Point> corners;
std::vector<cv::Size> imgSizes;

/*
here is code where I load images, create thier masks 
(like in the screen above) and calculate corners.
*/

cv::Ptr<cv::detail::SeamFinder> seamFinder = new cv::detail::DpSeamFinder();
seamFinder->find(inputImages, corners, masks);

cv::Ptr<cv::detail::Blender> blender = new cv::detail:: MultiBandBlender(false);
blender->prepare(corners, imgSizes);
for(size_t i = 0; i < inputImages.size(); i++)
{
    blender->feed(inputImages[i], masks[i], corners[i]);
}

cv::UMat blendedImg, outMask;
blender->blend(blendedImg, outMask);

Seam line of the images

SeamFinder дает мне результат, как на экране выше. Тонкие линии швов выглядят хорошо, и я очень доволен их формой. Но другая проблема возникает на следующем этапе. MultiBandBlender создает странные белые полосы, когда линия шва проходит в конце данных. Это пример:

Images after blending

Когда я не использую блендер, а просто использую маски, чтобы вырезать оригинальные изображения и просто добавить (cv::add() ) изображения вместе с дополнительным альфа-каналом (сделаны из масок) Я получаю очень хорошие результаты без каких-либо дырок и странных цветов, но мне нужно иметь более сглаженный переход: /

Может кто-нибудь помочь мне? Когда я создаю MultiBand Blender с меньшими num_bands, белые полосы становятся меньше, а с num_bands = 0 результаты выглядят как при добавлении изображений. Я посмотрел на методы feed() и blend() в MultiBandBlender и думаю, что он связан с гауссовой или лапласовой пирамидой и окончательным восстановлением изображений из лапласовой пирамиды в методе blend().

EDIT1: When Гауссовы и лапласовские пирамиды создаются copyMakeBorder(), что не позволяет MultiBandBlender создавать эти белые полосы, когда изображения полностью заполнены данными. Поэтому в моем случае я думаю, что мне нужно создать свой блендер почти так же, как MultiBandBlender, но метод copyMakeBorder() в методе feed() изменится на что-то, что «расширит» мое изображение внутри маски, как предложил @AlexanderKondratskiy. Теперь я не знаю, как добиться правильного «расширения», аналогичного BORDER_REFLECT или BORDER_REFLECT_101.

1 Ответ

1 голос
/ 09 января 2020

Я подозреваю, что ваши входные изображения содержат белые пиксели за пределами этих масок. Белые полосы появляются вокруг областей, где шов точно повторяет маску. Например, для лапласиана пиксели вне маски действительно влияют на конечный результат, так как каждый слой пирамиды по сути является неким размытым ядром на изображении.

Если у вас есть какие-то хорошие данные вне маски, сохраните их , Если вы этого не сделаете, я предлагаю «расширить» ваше изображение за пределы маски, чтобы обеспечить плавный переход.

Редактировать:

Вот две вещи, которые вы можете попробовать, если не придет кто-то с большим опытом работы с OpenCV вместе.

  1. Чтобы доказать / опровергнуть мою гипотезу, заполните черную область только средним или средним цветом внутри маски. Это должно сделать переход к внешнему региону менее резким и, надеюсь, уменьшить артефакты. Если этого не произойдет, мой ответ неверен.

  2. С точки зрения того, что, вероятно, является хорошим обобщением "BORDER_REFLECT", когда край произвольный, вы можете попробовать что-то вроде этого:

    • Найдите центроид c многоугольника маски
    • Для каждого пикселя p вне маски представьте линию между ней и c
    • Вычислите точку p' вдоль этой линии, которая находится на том же расстоянии внутри области маски, что и p от края маски. (т.е. вы отражаете по краю маски)
    • Линейная интерполяция цвета от соседей p' (так как его положение может не совпадать точно с серединой пикселя). Это цвет пикселя p
...