Blending does not remove seams in OpenCV(混合不会去除 OpenCV 中的接缝)
本文介绍了混合不会去除 OpenCV 中的接缝的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着跟版网的小编来一起学习吧!
问题描述
我正在尝试混合 2 个图像,以便它们之间的接缝消失.
I am trying to blend 2 images so that the seams between them disappear.
第一张图片:
第二张图片:
如果混合未应用:
如果应用了混合:
我使用了ALPHA BLENDING;没有接缝被移除;事实上图像仍然相同但更暗
I used ALPHA BLENDING; NO seam removed; in fact image STILL SAME BUT DARKER
这是我进行混合的部分
推荐答案
我选择根据到对象中心"的距离来定义 alpha 值,离对象中心越远,alpha 值越小.对象"由掩码定义.
I choose to define the alpha value depending on the distance to the "object center", the further the distance from the object center, the smaller the alpha value. The "object" is defined by a mask.
我已将图像与 GIMP 对齐(类似于您的 warpPerspective).它们需要在相同的坐标系中,并且两个图像必须具有相同的大小.
I've aligned the images with GIMP (similar to your warpPerspective). They need to be in same coordinate system and both images must have same size.
我的输入图像如下所示:
My input images look like this:
具有混合功能:我想需要一些评论和优化,我稍后会添加.
with blending function:
needs some comments and optimizations I guess, I'll add them later.
cv::Mat computeAlphaBlending(cv::Mat image1, cv::Mat mask1, cv::Mat image2, cv::Mat mask2)
{
cv::Mat bothMasks = mask1 | mask2;
cv::imshow("maskOR",bothMasks);
cv::Mat noMask = 255-bothMasks;
cv::Mat rawAlpha = cv::Mat(noMask.rows, noMask.cols, CV_32FC1);
rawAlpha = 1.0f;
cv::Mat border1 = 255-border(mask1);
cv::Mat border2 = 255-border(mask2);
cv::imshow("b1", border1);
cv::imshow("b2", border2);
cv::Mat dist1;
cv::distanceTransform(border1,dist1,CV_DIST_L2, 3);
double min, max; cv::Point minLoc, maxLoc;
cv::minMaxLoc(dist1,&min,&max, &minLoc, &maxLoc, mask1&(dist1>0));
dist1 = dist1* 1.0/max;
cv::Mat dist2;
cv::distanceTransform(border2,dist2,CV_DIST_L2, 3);
cv::minMaxLoc(dist2,&min,&max, &minLoc, &maxLoc, mask2&(dist2>0));
dist2 = dist2*1.0/max;
cv::Mat dist1Masked;
rawAlpha.copyTo(dist1Masked,noMask);
dist1.copyTo(dist1Masked,mask1);
rawAlpha.copyTo(dist1Masked,mask1&(255-mask2));
cv::Mat dist2Masked;
rawAlpha.copyTo(dist2Masked,noMask);
dist2.copyTo(dist2Masked,mask2);
rawAlpha.copyTo(dist2Masked,mask2&(255-mask1));
cv::imshow("d1", dist1Masked);
cv::imshow("d2", dist2Masked);
cv::Mat blendMaskSum = dist1Masked+dist2Masked;
cv::Mat im1Float;
image1.convertTo(im1Float,dist1Masked.type());
cv::imshow("im1Float", im1Float/255.0);
std::vector<cv::Mat> channels1;
cv::split(im1Float,channels1);
cv::Mat im1AlphaB = dist1Masked.mul(channels1[0]);
cv::Mat im1AlphaG = dist1Masked.mul(channels1[1]);
cv::Mat im1AlphaR = dist1Masked.mul(channels1[2]);
std::vector<cv::Mat> alpha1;
alpha1.push_back(im1AlphaB);
alpha1.push_back(im1AlphaG);
alpha1.push_back(im1AlphaR);
cv::Mat im1Alpha;
cv::merge(alpha1,im1Alpha);
cv::imshow("alpha1", im1Alpha/255.0);
cv::Mat im2Float;
image2.convertTo(im2Float,dist2Masked.type());
std::vector<cv::Mat> channels2;
cv::split(im2Float,channels2);
cv::Mat im2AlphaB = dist2Masked.mul(channels2[0]);
cv::Mat im2AlphaG = dist2Masked.mul(channels2[1]);
cv::Mat im2AlphaR = dist2Masked.mul(channels2[2]);
std::vector<cv::Mat> alpha2;
alpha2.push_back(im2AlphaB);
alpha2.push_back(im2AlphaG);
alpha2.push_back(im2AlphaR);
cv::Mat im2Alpha;
cv::merge(alpha2,im2Alpha);
cv::imshow("alpha2", im2Alpha/255.0);
cv::Mat imBlendedB = (im1AlphaB + im2AlphaB)/blendMaskSum;
cv::Mat imBlendedG = (im1AlphaG + im2AlphaG)/blendMaskSum;
cv::Mat imBlendedR = (im1AlphaR + im2AlphaR)/blendMaskSum;
std::vector<cv::Mat> channelsBlended;
channelsBlended.push_back(imBlendedB);
channelsBlended.push_back(imBlendedG);
channelsBlended.push_back(imBlendedR);
cv::Mat merged;
cv::merge(channelsBlended,merged);
cv::Mat merged8U;
merged.convertTo(merged8U,CV_8UC3);
return merged8U;
}
和辅助函数:
结果:
忘记了一个函数;)现在保持原始背景
edit: forgot a function ;)
edit: now keeping original background
这篇关于混合不会去除 OpenCV 中的接缝的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持跟版网!
本站部分内容来源互联网,如果有图片或者内容侵犯您的权益请联系我们删除!