Вот как я хотел бы сделать это в целом:
int main(int argc, char* argv[])
{
cv::Mat input1 = cv::imread("C:/StackOverflow/Input/pano1.jpg");
cv::Mat input2 = cv::imread("C:/StackOverflow/Input/pano2.jpg");
// compute the vignetting masks. This is much easier before warping, but I will try...
// it can be precomputed, if the size and position of your ROI in the image doesnt change and can be precomputed and aligned, if you can determine the ROI for every image
// the compression artifacts make it a little bit worse here, I try to extract all the non-black regions in the images.
cv::Mat mask1;
cv::inRange(input1, cv::Vec3b(10, 10, 10), cv::Vec3b(255, 255, 255), mask1);
cv::Mat mask2;
cv::inRange(input2, cv::Vec3b(10, 10, 10), cv::Vec3b(255, 255, 255), mask2);
// now compute the distance from the ROI border:
cv::Mat dt1;
cv::distanceTransform(mask1, dt1, CV_DIST_L1, 3);
cv::Mat dt2;
cv::distanceTransform(mask2, dt2, CV_DIST_L1, 3);
// now you can use the distance values for blending directly. If the distance value is smaller this means that the value is worse (your vignetting becomes worse at the image border)
cv::Mat mosaic = cv::Mat(input1.size(), input1.type(), cv::Scalar(0, 0, 0));
for (int j = 0; j < mosaic.rows; ++j)
for (int i = 0; i < mosaic.cols; ++i)
{
float a = dt1.at<float>(j, i);
float b = dt2.at<float>(j, i);
float alpha = a/(a + b); // distances are not between 0 and 1 but this value is. The "better" a is, compared to b, the higher is alpha.
// actual blending: alpha*A + beta*B
mosaic.at<cv::Vec3b>(j, i) = alpha*input1.at<cv::Vec3b>(j, i) + (1 - alpha)* input2.at<cv::Vec3b>(j, i);
}
cv::imshow("mosaic", mosaic);
cv::waitKey(0);
return 0;
}
в принципе вы вычислить расстояние от границы ROI до центра ваших объектов и вычислить ALP га из обоих значений смешивания маски. Поэтому, если одно изображение находится на большом расстоянии от границы, а другое - на небольшом расстоянии от границы, вы предпочитаете пиксель, который ближе к центру изображения. Было бы лучше нормализовать эти значения для случаев, когда искаженные изображения не имеют одинакового размера. Но еще лучше и эффективнее предкоммутировать маски наложения и деформировать их. Лучше всего было бы узнать виньетирование вашей оптической системы и выбрать и идентичную маску смешивания (как правило, более низкие значения границы).
Из предыдущего кода вы получите эти результаты: ROI маски:
Blending маски (так же, как впечатление, должно быть поплавок матрицы вместо):
мозаичное изображение:
Источник изображения, кажется, предварительно умноженное с фоном. Не могли бы вы показать формулу, которую вы используете до сих пор? – K3N
@ K3N, я отредактировал и добавил код. Дайте мне знать, если это поможет. – Metal
Не могли бы вы предоставить 3 отдельных искаженных изображения, а также перекрывающиеся координаты? Это позволит людям проверять различные подходы. – Miki