我有一组图像和相关的权重。我想把它们混合在一起。我知道OpenCV中有一个混合命令来混合两个图像。但是如何将多个图像混合在一起?
答案 0 :(得分:3)
可以使用以下代码完成混合(这是使用OpenCV的Java):
//Create a black-colored image
Mat mergedImage = new Mat(inputImageSize, inputImageType, new Scalar(0));
//Add each image from a vector<Mat> inputImages with weight 1.0/n where n is number of images to merge
for (Mat mat : inputImages) {
Core.addWeighted(mergedImage, 1, mat, 1.0/n, 0, mergedImage);
}
编辑: - 上述代码遭遇舍入错误。如果inputImageType是整数类型,除以1/n
将导致此问题。因此,上面的代码只能用于浮动矩阵。
答案 1 :(得分:2)
简单矩阵运算怎么样,如下所示?
blendedImage = weight_1 * image_1 + weight_2 * image_2 + ... + weight_n * image_n
答案 2 :(得分:0)
这是用于在列表中混合多个图像的 Python 代码。我使用了丹尼斯回答中的基本公式。
首先,让我们得到三个图像。
import numpy as np
import cv2
import matplotlib.pyplot as plt
import matplotlib.image as mpimg
dim = (425, 425)
apple = mpimg.imread('apple.jpg')
apple = cv2.resize(apple, dim)
banana = mpimg.imread('banana.jpg')
banana = cv2.resize(banana, dim)
orange = mpimg.imread('orange.jpg')
orange = cv2.resize(orange, dim)
_ = plt.imshow(apple)
_ = plt.show()
_ = plt.imshow(banana)
_ = plt.show()
_ = plt.imshow(orange)
_ = plt.show()
图片如下:
现在让我们将它们平均混合在一起。由于有三张图片,每张图片对最终输出的贡献率为 0.333。
def blend(list_images): # Blend images equally.
equal_fraction = 1.0 / (len(list_images))
output = np.zeros_like(list_images[0])
for img in list_images:
output = output + img * equal_fraction
output = output.astype(np.uint8)
return output
list_images = [apple, banana, orange]
output = blend(list_images)
_ = plt.imshow(output)
结果如下: