我想做的是:

结合这两个图像:

Text Text

使用此面具:

Text

要创建此输出:

Text

任务:

编写一个程序,根据图像 pyramid 创建具有面具的两个图像的合成图像.

现在,这就是我迄今为止try 过的:

    import cv2
    import numpy as np

# Read the input images and the mask
    image1 = cv2.imread("figure2-assignment3.jpg")
    image2 = cv2.imread("figure3-assignment3.jpg")
    mask = cv2.imread("figure4-assignment3.jpg", cv2.IMREAD_GRAYSCALE)

# Smooth out the mask
    mask = cv2.GaussianBlur(mask, (5, 5), 0)

# Convert mask to float32 and normalize to range [0, 1]
    mask = mask.astype(np.float32) / 255.0

# Duplicate the mask to match the number of channels in the images
    mask = cv2.cvtColor(mask, cv2.COLOR_GRAY2BGR)

# Generate Gaussian pyramids for both images and the mask
    gaussian_pyramid_image1 = [image1]
    gaussian_pyramid_image2 = [image2]
    gaussian_pyramid_mask = [mask]

    for _ in range(6):  
        image1 = cv2.pyrDown(image1)
        gaussian_pyramid_image1.append(image1)
    
    image2 = cv2.pyrDown(image2)
    gaussian_pyramid_image2.append(image2)
    
    mask = cv2.pyrDown(mask)
    gaussian_pyramid_mask.append(mask)

# Generate Laplacian pyramids for both images
    laplacian_pyramid_image1 = [gaussian_pyramid_image1[-1]]
    laplacian_pyramid_image2 = [gaussian_pyramid_image2[-1]]

    for i in range(5, 0, -1):  # Start from the second last level
       image1_up = cv2.pyrUp(gaussian_pyramid_image1[i])
       image2_up = cv2.pyrUp(gaussian_pyramid_image2[i])

    image1_resized = cv2.resize(gaussian_pyramid_image1[i - 1], (image1_up.shape[1], image1_up.shape[0]))
    image2_resized = cv2.resize(gaussian_pyramid_image2[i - 1], (image2_up.shape[1], image2_up.shape[0]))
    
    laplacian_image1 = cv2.subtract(image1_resized, image1_up)
    laplacian_image2 = cv2.subtract(image2_resized, image2_up)
    
    laplacian_pyramid_image1.append(laplacian_image1)
    laplacian_pyramid_image2.append(laplacian_image2)

# Generate Gaussian pyramid for the mask
    gaussian_pyramid_mask = [gaussian_pyramid_mask[-1]]
# Start from the second last level
    for i in range(5, 0, -1):  
        mask_up = cv2.pyrUp(gaussian_pyramid_mask[-1])
        mask_resized = cv2.resize(gaussian_pyramid_mask[-1], (mask_up.shape[1], mask_up.shape[0]))
        gaussian_pyramid_mask.append(mask_resized)

# Combine the corresponding levels of Laplacian pyramids using the mask
    composite_pyramid = []
    for img1, img2, msk in zip(laplacian_pyramid_image1, laplacian_pyramid_image2, gaussian_pyramid_mask):
        img1_resized = cv2.resize(img1, (msk.shape[1], msk.shape[0]))
        img2_resized = cv2.resize(img2, (msk.shape[1], msk.shape[0]))
        composite_level = img1_resized * msk + img2_resized * (1.0 - msk)
        composite_pyramid.append(composite_level)

# Collapse the composite pyramid to obtain the composite image
    composite_image = composite_pyramid[-1]
    for i in range(len(composite_pyramid) - 2, -1, -1):
       composite_image_up = cv2.pyrUp(composite_image)
       composite_image_resized = cv2.resize(composite_pyramid[i], (composite_image_up.shape[1], 
       composite_image_up.shape[0]))
       composite_image = cv2.add(composite_image_resized, composite_image_up)

# Save the composite image
     cv2.imwrite("composite_image_2.jpg", composite_image)

And this is the best I could produce: Text

现在我可能做错了什么?我可以拿到手,但合成图像的右侧不是正确的.

推荐答案

APPROACH 1: Custom Alpha Blending (shorter)

我不会太担心使用高斯 pyramid 或拉普拉斯 pyramid 来实现这一点.相反,您可以使用所提供的平滑版本的面膜执行Alpha混合(这确保了平滑的边界),以达到所需的输出.以下是我解决您问题的方法:

import cv2
import numpy as np

# Read the input images and the mask
mask = cv2.imread("mask.jpeg", cv2.IMREAD_GRAYSCALE)
image1 = cv2.imread("image-1.jpeg")
image2 = cv2.imread("image-2.jpeg")

# Resize images to match mask dimensions
height, width = mask.shape[:2]
image1 = cv2.resize(image1, (width, height))
image2 = cv2.resize(image2, (width, height))

# Smooth out the mask and normalize to range [0, 1]
transparency_gradient = cv2.blur(mask, (25, 25))
transparency_gradient = cv2.cvtColor(transparency_gradient, cv2.COLOR_GRAY2BGR)
transparency_gradient = transparency_gradient / 255.0  # Normalize to range [0, 1]

# Perform manual alpha blending with transparency gradient
composite_image = image1 * transparency_gradient + image2 * (1 - transparency_gradient)

# Save the result
cv2.imwrite("composite_image.png", composite_image)

Which yields this final image: Final Composite Image




APPROACH 2: Blending through Gaussian and Laplacian Pyramids

如果目标是通过 pyramid 实现这种混合,那么下面是一个可以做到这一点的代码:

import cv2
import numpy as np

# Read the input images and the mask
mask = cv2.imread("mask.jpeg", cv2.IMREAD_GRAYSCALE)
image1 = cv2.imread("image-1.jpeg")
image2 = cv2.imread("image-2.jpeg")

# Set the level of the pyramids (tweak it for better accuracy)
levels=6

# Resize images to match mask dimensions
height, width = image1.shape[:2]
mask = cv2.resize(mask, (width, height), interpolation=cv2.INTER_LINEAR)

# Duplicate the mask to match the number of channels in the images
mask = cv2.cvtColor(mask, cv2.COLOR_GRAY2BGR)

# Generate Gaussian pyramids for both images and the mask
gaussian_pyramid1 = [image1.astype(np.float32)]
gaussian_pyramid2 = [image2.astype(np.float32)]
mask_pyramid = [mask.astype(np.float32) / 255.0]

for _ in range(levels - 1):
    image1 = cv2.pyrDown(image1)
    image2 = cv2.pyrDown(image2)
    mask = cv2.pyrDown(mask)

    gaussian_pyramid1.append(image1.astype(np.float32))
    gaussian_pyramid2.append(image2.astype(np.float32))
    mask_pyramid.append(mask.astype(np.float32) / 255.0)

# Generate Laplacian pyramids for both images
laplacian_pyramid1 = [gaussian_pyramid1[levels - 1]]
laplacian_pyramid2 = [gaussian_pyramid2[levels - 1]]
for i in range(levels - 2, -1, -1):
    expanded1 = cv2.pyrUp(gaussian_pyramid1[i + 1], dstsize=(gaussian_pyramid1[i].shape[1], gaussian_pyramid1[i].shape[0]))
    expanded2 = cv2.pyrUp(gaussian_pyramid2[i + 1], dstsize=(gaussian_pyramid2[i].shape[1], gaussian_pyramid2[i].shape[0]))
    laplacian1 = cv2.subtract(gaussian_pyramid1[i], expanded1)
    laplacian2 = cv2.subtract(gaussian_pyramid2[i], expanded2)
    laplacian_pyramid1.append(laplacian1)
    laplacian_pyramid2.append(laplacian2)

# Combine the corresponding levels of Laplacian pyramids using the mask
composite_pyramid = []
for laplacian1, laplacian2, mask in zip(laplacian_pyramid1, laplacian_pyramid2, mask_pyramid):
    mask_resized = cv2.resize(mask, (laplacian1.shape[1], laplacian1.shape[0]), interpolation=cv2.INTER_LINEAR)
    composite_level = laplacian1 * mask_resized + laplacian2 * (1.0 - mask_resized)
    composite_pyramid.append(composite_level)

# Reconstruct the final blended image
composite_image = composite_pyramid[0]
for i in range(1, levels):
    composite_image = cv2.pyrUp(composite_image, dstsize=(composite_pyramid[i].shape[1], composite_pyramid[i].shape[0]))
    composite_image += composite_pyramid[i]

# Ensure pixel values are within valid range
composite_image = np.clip(composite_image, 0, 255).astype(np.uint8)

# Save Image
cv2.imwrite("composite_image.png", composite_image)

Which produces: 2nd Approach

现在是你的 Select 了.祝你好运!愿密码与你同在……

Python相关问答推荐

难以在Manim中正确定位对象

Pandas 有条件轮班操作

切片包括面具的第一个实例在内的眼镜的最佳方法是什么?

无法使用requests或Selenium抓取一个href链接

我们可以为Flask模型中的id字段主键设置默认uuid吗

计算每个IP的平均值

计算分布的标准差

无法连接到Keycloat服务器

Python中的变量每次增加超过1

Python Tkinter为特定样式调整所有ttkbootstrap或ttk Button填充的大小,适用于所有主题

如何创建引用列表并分配值的Systemrame列

具有相同图例 colored颜色 和标签的堆叠子图

提高算法效率的策略?

如何在Python Pandas中填充外部连接后的列中填充DDL值

简单 torch 模型测试:ModuleNotFoundError:没有名为';Ultralytics.yolo';

在第一次调用时使用不同行为的re. sub的最佳方式

将像素信息写入文件并读取该文件

如何在表单中添加管理员风格的输入(PDF)

时间戳上的SOAP头签名无效

将时间序列附加到数据帧