如何在OpenCV中合并两个图像而不失去强度

5
我有两张opencv图像:Image AImage BImage A是从相机中输出的帧。
Image B是一个透明度alpha图像,通过对一张图片进行蒙版处理得到。
在进行蒙版处理之前,需要使用cvWarpPerspective()Image B进行变形。
  • 我尝试了cvAddWeighted(),但当给出alpha值和beta值时,它会失去强度。
  • 我尝试了aishack,但即使在这里,你也会失去输出图像的整体强度。
  • 我尝试了silveiraneto.net,但在我的情况下没有帮助。
请帮我找出一些方法,使混合后的输出图像不会失去强度。
提前感谢您。
2个回答

2
当你说失去强度时,你是否意味着:
1. 当你添加图像时,你达到了最大强度,其余部分被丢弃。(例如8位像素加法:Pix1 = 200 i,Pix2 = 150 i。"Pix1 + Pix2 = 350",但最大值为255,因此Pix1 + Pix2 = 255)
2. 图像A的原始值通过添加到仅覆盖图像某些部分的图像B而受到影响。(例如8位图像:Pix1 = 200 i,Pix2 = 150,(Pix1 + Pix2)/ 2 = 175,但当第二个图像的像素值为零时,Pix2 = 0。然后(Pix1 + Pix2)/ 2 = 100,这是原始图像值的一半)
其中之一的观察结果应该告诉你需要做什么。根据您提到的功能,我不太清楚它们使用哪种方法。

谢谢你的回答,我给你点赞。但是我需要的是......假设你在Photoshop中有一个眼镜图像(png透明),你如何通过拖动它并调整前后位置将该图像覆盖到某人的脸上(另一张图片)......我想在OpenCV中做同样的事情......你所说的都是我的问题......我需要一些避免这种情况的方法...... - Wazy
如果您可以使用四通道图像(如RGB(A))而不是仅有的三通道(如RGB)进行工作,那么您可能可以通过将图像A(背景图像)中的每个像素向新图像(带有透明度)进行更改,并根据alpha通道在0到1的比例尺上执行此操作。很抱歉我仍然无法提供一些准确的代码示例。 - Sonaten
此外,如果您的透明度仅限于“开”和“关”值,则可能只需检查透明图像中每个像素的 alpha 值,然后在 alpha 值为“true”时将该值写入您的背景图像。 - Sonaten

2

我终于得到了答案。它包含5个步骤...

第一步

cvGetPerspectiveTransform(q,pnt,warp_matrix); 
//where pnt is four point x and y cordinates and warp_matrix is a 3 x 3 matrix

步骤 - 2

cvWarpPerspective(dst2, neg_img, warp_matrix,CV_INTER_LINEAR)
//dst2 is overlay image ,neg_img is a blank image 

Step - 3 第三步
cvSmooth(neg_img,neg_img,CV_MEDIAN); //smoothing the image

步骤 - 4

cvThreshold(neg_img, cpy_img, 0, 255, CV_THRESH_BINARY_INV);
//cpy_img is a created image from image_n

步骤 - 5

cvAnd(cpy_img,image_n,cpy_img);// image_n is a input image
cvOr(neg_img,cpy_img,image_n);

输出 - 图像_n(不会失去输入图像的强度)


你将获得没有抗锯齿的叠加效果。你可以分两步完成:1)获取warp_matrix,2)使用warpPerspective函数对pic进行透视变换,将结果存入frame中,参数为frame.size()、INTER_LINEAR和BORDER_TRANSPARENT。 - Vital Belikov

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接