You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Python中叠加图像?毛发去除反向操作异常求助

问题描述

尝试叠加两张皮肤镜图像时结果不符合预期:

  • image1:带有毛发遮挡的皮肤镜图像
  • image2:无毛发的皮肤镜图像
    通过减法操作提取毛发后,用加法反向操作还原图像,原本黑色的毛发显示为白色,预期加法操作能正确还原原始带毛发的图像。

复现代码

from PIL import Image, ImageChops

# Load the images
image1 = Image.open('C:/Users/asus/Desktop/Testing/hairoccluded/ISIC_0024327.jpg')
image2 = Image.open('C:/Users/asus/Desktop/Testing/hairfree/ISIC_0024327.jpg')

# Subtract image2 from image1
subtracted_image = ImageChops.subtract(image2, image1)

# Reverse the subtraction using ImageChops.add
reversed_image = ImageChops.add(image2, subtracted_image)

# Display the reversed image
reversed_image.show()

问题原因

PIL的ImageChops.subtract和ImageChops.add是带截断的逐像素运算:

  • 像素值被强制限制在0-255范围,超出部分会被截断(低于0设为0,高于255设为255)。
  • 毛发区域在image1中是深色(低像素值),image2是正常皮肤(高像素值),执行image2 - image1时,毛发区域会得到较大的正差值。
  • 后续执行image2 + 差值时,毛发区域像素值会超过255,被截断为255(纯白色),导致异常结果。

解决办法

方法1:用numpy处理无截断运算

借助numpy保留完整像素差值,再反向计算还原图像:

from PIL import Image
import numpy as np

# 加载图像并转为numpy数组
img1 = np.array(image1).astype(np.int32)
img2 = np.array(image2).astype(np.int32)

# 计算差值(保留完整数值)
diff = img1 - img2

# 反向还原并修正像素范围
restored = img2 + diff
restored = np.clip(restored, 0, 255).astype(np.uint8)

# 转为PIL图像并显示
Image.fromarray(restored).show()

方法2:直接提取毛发掩码合成

如果目标是从image2还原出image1,可直接提取毛发区域后合成:

from PIL import Image
import numpy as np

img1 = np.array(image1)
img2 = np.array(image2)

# 生成毛发掩码(根据像素差异阈值判定,可自行调整阈值)
diff = np.abs(img1 - img2).sum(axis=2)
hair_mask = diff > 30

# 将image1的毛发区域复制到image2上
restored = img2.copy()
restored[hair_mask] = img1[hair_mask]

Image.fromarray(restored).show()

内容的提问来源于stack exchange,提问作者Dalal

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.20 05:07:38