Я работаю с OpenCV 3.4.8 с С++ 11 и пытаюсь смешивать изображения вместе. В этом примере у меня есть 2 изображения (маска Тьера показана на экране ниже). У меня есть географическая привязка, поэтому я могу легко вычислить углы этих изображений в финальном изображении. Данные за пределами масок окрашены в черный цвет.
Мой код выглядит примерно так:
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);
SeamFinder дает мне результат, как на экране выше. Найденные линии швов выглядят хорошо, и я ими очень довольна. Но другая проблема возникает на следующем шаге. MultiBandBlender создает странные белые полосы, когда линия стыка проходит в конце данных. Вот пример:
Когда я не использую блендер, а просто использую маски для вырезания исходных изображений и просто добавляю (cv::add()
) изображения вместе с дополнительным альфа-каналом (сделанным из масок), я получаю очень хорошие результаты без каких-либо дыр и странных цветов, но мне нужно иметь более сглаженный переход :/
Может кто-нибудь помочь мне? Когда я создаю MultiBand Blender с меньшим num_bands, белые полосы становятся меньше, а с num_bands = 0 результаты выглядят так же, как и при добавлении изображений. Я посмотрел методы feed()
и blend()
в MultiBandBlender и думаю, что это связано с пирамидой Гаусса или Лапласа и окончательным восстановлением изображений из пирамиды Лапласа в методе blend()
.
РЕДАКТИРОВАТЬ 1: когда создаются пирамиды Гаусса и Лапласа, copyMakeBorder()
не позволяет MultiBandBlender создавать эти белые полосы, когда изображения полностью заполнены данными. Поэтому в моем случае я думаю, что мне нужно создать свой блендер почти так же, как MultiBandBlender, но метод copyMakeBorder()
в методе feed()
изменить на что-то, что будет «расширять» мое изображение внутри маски, как предложил @AlexanderKondratskiy. Теперь я не знаю, как добиться правильного «расширения», похожего на BORDER_REFLECT или BORDER_REFLECT_101.