Sonfire Asked:2020-02-28 18:39:58 +0800 CST2020-02-28 18:39:58 +0800 CST 2020-02-28 18:39:58 +0800 CST opencv图像叠加 772 有一个格式的图像,png您需要将其替换为背景。在保持透明度的同时。 示例代码C# Mat scr= new Mat("С:/1.png"); Mat bg= new Mat("С:/1.jpg"); Mat clones = new Mat(scr.Size(), MatType.CV_8UC4); Cv2.AddWeighted(bg, 1, scr, 1, 0, clones ); 没有合适的东西出来。 有两张图片。第一个是透明背景。 和第二个,分别是背景 我需要这个结果。 c# 2 个回答 Voted Best Answer strawdog 2020-02-29T07:36:42+08:002020-02-29T07:36:42+08:00 似乎一切都写在 opencv文档中。 在你的情况下: import cv2 as cv img1 = cv.imread('bg.jpg') img2 = cv.imread('dice.png') brows, bcols = img1.shape[:2] rows,cols,channels = img2.shape # Ниже я изменил roi, чтобы картинка выводилась посередине, а не в левом верхнем углу roi = img1[int(brows/2)-int(rows/2):int(brows/2)+int(rows/2), int(bcols/2)- int(cols/2):int(bcols/2)+int(cols/2) ] img2gray = cv.cvtColor(img2,cv.COLOR_BGR2GRAY) ret, mask = cv.threshold(img2gray, 10, 255, cv.THRESH_BINARY) mask_inv = cv.bitwise_not(mask) img1_bg = cv.bitwise_and(roi,roi,mask = mask_inv) img2_fg = cv.bitwise_and(img2,img2,mask = mask) dst = cv.add(img1_bg,img2_fg) img1[int(brows/2)-int(rows/2):int(brows/2)+int(rows/2), int(bcols/2)- int(cols/2):int(bcols/2)+int(cols/2) ] = dst cv.imwrite('res.jpg',img1) 可以看出边缘的锐度存在问题,但是你自己。 Усердный бобёр 2021-12-28T00:12:38+08:002021-12-28T00:12:38+08:00 在 Python 中,这可以使用 Numpy 方法完成: def overlay(background, img, x, y): b = numpy.copy(background) place = b[y: y + img.shape[0], x: x + img.shape[1]] a = img[..., 3:].repeat(3, axis=2).astype('uint16') place[..., :3] = (place[..., :3].astype('uint16') * (255 - a) // 255) + img[..., :3].astype('uint16') * a // 255 return b 背景是背景。img - 图像。x 和 y - 背景图像左上角的坐标。返回一个结果。为了正常读取alpha通道,需要在imread函数中设置cv2.IMREAD_UNCHANGED标志。 cv2.imread('image.png', cv2.IMREAD_UNCHANGED) 在这种情况下,图片和背景都必须是 RGBA 格式。如果背景是 RGB 格式,您可以这样做: def overlay(background, img, x, y): b = numpy.copy(background) place = b[y: y + img.shape[0], x: x + img.shape[1]] a = img[..., 3:].repeat(3, axis=2).astype('uint16') place[...] = (place.astype('uint16') * (255 - a) // 255) + img[..., :3].astype('uint16') * a // 255 return b 完美运行。
似乎一切都写在 opencv文档中。
在你的情况下:
可以看出边缘的锐度存在问题,但是你自己。
在 Python 中,这可以使用 Numpy 方法完成:
背景是背景。img - 图像。x 和 y - 背景图像左上角的坐标。返回一个结果。为了正常读取alpha通道,需要在imread函数中设置cv2.IMREAD_UNCHANGED标志。
在这种情况下,图片和背景都必须是 RGBA 格式。如果背景是 RGB 格式,您可以这样做:
完美运行。