<p>这是对你问题的纯粹的回答。在</p>
<p>为了找出两者的区别图像:-在</p>
<pre><code>from PIL import Image, ImageChops, ImageEnhance
img1 = Image.open(r"base.png")
img2 = Image.open(r"light.png")
diff = ImageChops.difference(img2, img1)
</code></pre>
<p><code>ImageChops.difference()</code>接受两个图像对象作为参数,并返回两个对象之间逐像素差的绝对值。简而言之,它计算两个图像之间的<strong>差异。在</p>
<p><strong>输出<code>diff.show()</code>:-</strong></p>
<p><a href="https://i.stack.imgur.com/gnpHv.png" rel="nofollow noreferrer"><img src="https://i.stack.imgur.com/gnpHv.png" alt="enter image description here"/></a></p>
<p>现在,由于我们已经获得了这两幅图像的差分点,我们现在可以从<strong>diff</strong>图像和原始<strong>基础</strong>图像中创建一个合成图像</p>
<p>将这行代码添加到上一行代码:-在</p>
^{pr2}$
<p><code>Image.blend()</code>将两个图像对象和一个阈值作为参数,并使用常量alpha(threshold参数)在两个输入图像之间插值来创建一个新图像。输出由公式:-在</p>
<blockquote>
<p>image1 * (1.0 - alpha) + image2 * alpha</p>
</blockquote>
<p>其中image1和image2是图像对象,alpha是阈值。由于我们使用<code>0.5</code>作为阈值,因此公式更改为:-</p>
<blockquote>
<p>(image1 * 0.5) + (image2 * 0.5)</p>
</blockquote>
<p>这意味着我们要取image1的一半颜色值(base)和image2的一半(diff)。因为,差分图像(diff)主要包含黑色像素,因此我们的基础图像的颜色像素亮度值减半(或变得比以前更暗)。在</p>
<p><strong>输出<code>overlaid_img1.show()</code>:-</strong></p>
<p><a href="https://i.stack.imgur.com/23QGw.png" rel="nofollow noreferrer"><img src="https://i.stack.imgur.com/23QGw.png" alt="enter image description here"/></a></p>
<p>现在,为了使基础图像的像素获得原始亮度值,我们需要将<code>Image.blend()</code>获得的输出图像的亮度加倍。在</p>
<p>将此行添加到原始行代码:-在</p>
<pre><code>bright_overlay_img1 = ImageEnhance.Brightness(overlaid_img1).enhance(2.0)
</code></pre>
<p><code>ImageEnhance.Brightness()</code>是一个用来调整图像亮度的类。<code>ImageEnhance.Brightness.enhance()</code>是用于执行此操作的函数。在</p>
<p><code>enhance(2.0)</code>所做的是,它使<code>overlaid_img1</code>图像对象中每个像素的亮度值加倍。在</p>
<p><strong>输出<code>bright_overlay_img1.show()</code>:-</strong></p>
<p><a href="https://i.stack.imgur.com/ze9L8.png" rel="nofollow noreferrer"><img src="https://i.stack.imgur.com/ze9L8.png" alt="enter image description here"/></a></p>
<p><strong>p.S.:-</strong>原始代码是通过在答案中添加所有提供的代码生成的。我对原始代码进行了分段,以便能够解释每个函数的工作原理及其背后的推理。因此,对于完整的工作,只需附加答案中提供的每个代码。在</p>
<p><strong>编辑:-</strong></p>
<p>刚刚看到你对@fmw42答案的评论,原来你的要求和你问的问题不一样。在</p>
<p>根据我的理解,您希望<code>diff</code>(存储两个图像的差异的图像)的格式支持alpha(透明度),而不是一个完全黑色的图像。在</p>
<p>为了这个用这个代码:-在</p>
<pre><code># This is the full code
from PIL import Image, ImageChops, ImageEnhance
img1 = Image.open(r"base.png")
img2 = Image.open(r"light.png")
diff = ImageChops.difference(img2, img1).convert("RGBA")
pixels = diff.load()
for x in range(diff.size[0]):
for y in range(diff.size[1]):
if pixels[x, y] == (0, 0, 0, 255):
pixels[x, y] = (0, 0, 0, 0)
diff.save("alpha_difference.png") # saving the difference image (having alpha channel)
overlaid_img1 = Image.blend(img1.convert("RGBA"), diff, 0.5)
bright_overlay_img1 = ImageEnhance.Brightness(overlaid_img1).enhance(2.0).convert("RGB")
</code></pre>
<p>上面的代码与我之前提到的不同之处在于,它将差异图像<code>diff</code>转换为alpha通道图像,如果它的颜色是完全黑色的(与原始图像没有区别),那么它将使像素透明。在</p>
<p><strong>差分图像(有alpha通道):-</strong></p>
<p><a href="https://i.stack.imgur.com/0RkZT.png" rel="nofollow noreferrer"><img src="https://i.stack.imgur.com/0RkZT.png" alt="enter image description here"/></a></p>
<p>两段代码的输出仍然是相同的。在</p>
<p><strong>p.S.:-</strong>我建议您更改问题的标题/描述,并在那里明确说明您的问题。在</p>