我还有惨叫功能:
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)
我尝试了其他组合选项,仍然得到错误的问题与形状,照片可能是一个问题或与代码的东西?
谢谢你们的帮助,伙计们:)
3条答案
按热度按时间qij5mzcb1#
这里有一种在Python/OpenCV中实现的方法。我将把一个20%大小的徽标放在裤子图像上,位于右侧口袋的坐标660,660处。
背景图像:
前景图像:
结果:
olhwl3o22#
这是没有回答。我需要一个比877x766到160x120更小的尺寸。我将在2天内删除。
以下是屏幕截图:
较小的尺寸将固定在左上角。我不能缩小图像。
z4bn682m3#
这只需要一些乘法和减法。
你的覆盖图有一个真实的alpha通道,而不仅仅是一个布尔遮罩。你应该使用它。它使边缘看起来比一个硬布尔遮罩更好。
我发现您的覆盖图有一个问题:它没有任何“阴影”来给予白色文本与潜在的白色背景形成对比。
调整RGBA数据大小时,这并不简单。您最好首先以所需的分辨率从矢量图形程序中导出图形。事后调整大小需要操作以确保部分透明像素(既不是100%不透明,也不是100%透明)计算正确,因此未定义“背景”来自覆盖图像的完全透明区域的像素不混合到那些部分透明的像素中。
第一个