使用Python实现多同尺寸图像等权重混合的问题排查
解决多图像等权重混合的问题
嘿,我看了你的代码,问题出在循环里没有正确累加所有图像的权重值,导致最后只混合了第一张和最后一张图。让我给你拆解一下问题,再给出修正方案:
问题根源
你的代码里,aggregate_file初始化是第一张图乘权重,但在循环中每次计算dst = aggregate_file + (next_img*uniWeight)后,没有把dst赋值回aggregate_file。这意味着每次循环都是用最初的第一张图权重值,加上当前图的权重值,之前循环的结果完全没被保留,最后自然只剩第一张和最后一张的混合效果。
另外还有个小坑:cv2.imread读出来的是uint8类型(0-255的整数),直接做浮点乘法会有精度丢失,最好先转成浮点类型再计算。
修正后的代码
import os import cv2 def prepend(list, str): str += '{0}' list = [str.format(i) for i in list] return list path = "EvalImages/" jpeg_list = os.listdir(path) if '.DS_Store' in jpeg_list: jpeg_list.remove('.DS_Store') jpeg_list = prepend(jpeg_list, path) num_images = len(jpeg_list) uniWeight = 1.0 / num_images print(f"统一权重: {uniWeight}") print(f"待混合图像: {jpeg_list}") # 初始化聚合图像,转成float32避免精度损失 aggregate_file = cv2.imread(jpeg_list[0]).astype('float32') * uniWeight # 遍历剩下的所有图像,逐个累加权重 for img_path in jpeg_list[1:]: next_img = cv2.imread(img_path).astype('float32') # 核心:把当前图像的权重值加到聚合结果里 aggregate_file += next_img * uniWeight # 可选:实时查看混合进度 temp_show = cv2.convertScaleAbs(aggregate_file) cv2.imshow('Mixing Progress', temp_show) cv2.waitKey(20) # 留一点时间显示,防止窗口假死 # 输出当前图像信息 h, w, ch = next_img.shape print(f"{img_path} | 尺寸: {w}x{h} | 通道数: {ch}") # 转换回uint8格式保存最终结果 final_mix = cv2.convertScaleAbs(aggregate_file) cv2.imwrite('TestContainer/evalimage3.png', final_mix) cv2.destroyAllWindows()
关键改进点
- 正确累加权重:用
aggregate_file += next_img * uniWeight替代单次计算,这样每一张图的权重都会被持续累加到结果中,所有图像都能参与混合。 - 类型转换处理:将图像转为
float32进行浮点运算,避免整数运算的截断误差,最后用cv2.convertScaleAbs把结果转回0-255的正常图像范围。 - 更简洁的循环:直接遍历
jpeg_list[1:]跳过第一张图,比用索引循环更易读。 - 优化显示逻辑:添加
cv2.waitKey让显示窗口正常响应,循环结束后清理窗口。
这样修改后,所有图像就会按照相同的权重均匀混合,你就能看到整体的模式效果啦。
内容的提问来源于stack exchange,提问作者coder
相关产品推荐
相关产品推荐

