python 组合前景png图像与jpg背景

xzv2uavs  于 2022-12-10  发布在  Python
关注(0)|答案(3)|浏览(217)

我还有惨叫功能:

def alphaMerge(small_foreground, background, top, left):
    
    result = background.copy()
    
    fg_b, fg_g, fg_r, fg_a = cv.split(small_foreground)
    print(fg_b, fg_g, fg_r, fg_a)

    fg_a = fg_a / 255.0

    label_rgb = cv.merge([fg_b * fg_a, fg_g * fg_a, fg_r * fg_a])

    height, width = small_foreground.shape[0], small_foreground.shape[1]
    part_of_bg = result[top:top + height, left:left + width, :]

    bg_b, bg_g, bg_r = cv.split(part_of_bg)

    part_of_bg = cv.merge([bg_b * (1 - fg_a), bg_g * (1 - fg_a), bg_r * (1 - fg_a)])

    cv.add(label_rgb, part_of_bg, part_of_bg)
    result[top:top + height, left:left + width, :] = part_of_bg
    return result

if __name__ == '__main__':
   folder_dir = r"C:\photo_datasets\products_small"
   logo = cv.imread(r"C:\Users\PiotrSnella\photo_datasets\discount.png", cv.IMREAD_UNCHANGED)
   for images in os.listdir(folder_dir):
       input_path = os.path.join(folder_dir, images)
       image_size = os.stat(input_path).st_size
       if image_size < 8388608:
           img = cv.imread(input_path, cv.IMREAD_UNCHANGED)
           height, width, channels = img.shape
           if height > 500 and width > 500:
               result = alphaMerge(logo, img, 0, 0)
               cv.imwrite(r'C:\photo_datasets\products_small_output_cv\{}.png'.format(images), result)

我想合并两张图片,一张带有徽标,我想将其应用于文件夹products_small中的完整数据集。我收到错误part_of_bg = cv.merge([bg_b * (1 - fg_a), bg_g * (1 - fg_a), bg_r * (1 - fg_a)]) ValueError: operands could not be broadcast together with shapes (720,540) (766,827)
我尝试了其他组合选项,仍然得到错误的问题与形状,照片可能是一个问题或与代码的东西?
谢谢你们的帮助,伙计们:)

qij5mzcb

qij5mzcb1#

这里有一种在Python/OpenCV中实现的方法。我将把一个20%大小的徽标放在裤子图像上,位于右侧口袋的坐标660,660处。

  • 读取背景图像(裤子)
  • 读取前景图像(徽标)保持不变以保留Alpha通道
  • 将前景(徽标)大小调整为20%
  • 创建背景图像大小的透明图像
  • 将调整大小后的前景(徽标)插入透明图像中的所需位置
  • 从插入的、调整大小的前景图像中提取Alpha通道
  • 从插入的、调整大小的前景图像中提取基本BGR通道
  • 混合背景图像和基本BGR图像,使用alpha通道作为掩模,使用np.where()。注意所有图像必须是相同的尺寸和3个通道
  • 保存结果

背景图像:

前景图像:

import cv2
import numpy as np

# read background image
bimg = cv2.imread('pants.jpg')
hh, ww = bimg.shape[:2]

# read foreground image
fimg = cv2.imread('flashsale.png', cv2.IMREAD_UNCHANGED)

# resize foreground image
fimg_small = cv2.resize(fimg, (0,0), fx=0.2, fy=0.2)
ht, wd = fimg_small.shape[:2]

# create transparent image
fimg_new = np.full((hh,ww,4), (0,0,0,0), dtype=np.uint8)

# insert resized image into transparent image at desired coordinates
fimg_new[660:660+ht, 660:660+wd] = fimg_small

# extract alpha channel from foreground image as mask and make 3 channels
alpha = fimg_new[:,:,3]
alpha = cv2.merge([alpha,alpha,alpha])

# extract bgr channels from foreground image
base = fimg_new[:,:,0:3]

# blend the two images using the alpha channel as controlling mask
result = np.where(alpha==(0,0,0), bimg, base)

# save result
cv2.imwrite("pants_flashsale.png", result)

# show result
cv2.imshow("RESULT", result)
cv2.waitKey(0)

结果:

olhwl3o2

olhwl3o22#

这是没有回答。我需要一个比877x766到160x120更小的尺寸。我将在2天内删除

以下是屏幕截图:

较小的尺寸将固定在左上角。我不能缩小图像。

z4bn682m

z4bn682m3#

这只需要一些乘法和减法。
你的覆盖图有一个真实的alpha通道,而不仅仅是一个布尔遮罩。你应该使用它。它使边缘看起来比一个硬布尔遮罩更好。
我发现您的覆盖图有一个问题:它没有任何“阴影”来给予白色文本与潜在的白色背景形成对比。
调整RGBA数据大小时,这并不简单。您最好首先以所需的分辨率从矢量图形程序中导出图形。事后调整大小需要操作以确保部分透明像素(既不是100%不透明,也不是100%透明)计算正确,因此未定义“背景”来自覆盖图像的完全透明区域的像素不混合到那些部分透明的像素中。
第一个

相关问题