如何在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
相关产品推荐
相关产品推荐

