Я работаю с OpenCV 3.4.8 с C ++ 11 и пытаюсь смешать изображения вместе. В этом примере у меня есть 2 изображения (их маска показана на экране ниже). У меня есть географическая привязка, поэтому я могу легко рассчитать углы этих изображений в конечном изображении. Данные вне масок черные.
![Masks of the images before blending](https://i.stack.imgur.com/JUaKs.png)
Мой код выглядит примерно так:
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](https://i.stack.imgur.com/05TwD.png)
SeamFinder дает мне результат, как на экране выше. Тонкие линии швов выглядят хорошо, и я очень доволен их формой. Но другая проблема возникает на следующем этапе. MultiBandBlender создает странные белые полосы, когда линия шва проходит в конце данных. Это пример:
![Images after blending](https://i.stack.imgur.com/SuKvu.png)
Когда я не использую блендер, а просто использую маски, чтобы вырезать оригинальные изображения и просто добавить (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.