用python写一份两个同名文件夹内多个相同名字图片对比的脚本,当像素点RGB对比差异大于27时输出对比图标注差异位置为红色,小于5时为蓝色,
时间: 2024-02-21 20:58:45 浏览: 126
compare:比较两个文件的Python脚本
好的,这是一个比较具有挑战性的问题。我将尝试给出一个大致的思路,但是具体实现可能需要根据实际情况进行调整。
首先,我们需要使用 Python 的 PIL 库来读取图片。假设我们有两个同名文件夹 `folder1` 和 `folder2`,每个文件夹中都有多个同名图片,我们要对比这些图片的差异。
```python
from PIL import Image
import os
# 两个文件夹路径
folder1 = 'path/to/folder1'
folder2 = 'path/to/folder2'
# 遍历文件夹中的图片
for filename in os.listdir(folder1):
if filename.endswith('.jpg'): # 假设图片格式为 jpg
# 读取图片
img1 = Image.open(os.path.join(folder1, filename))
img2 = Image.open(os.path.join(folder2, filename))
# TODO: 对比两张图片的差异
```
接下来,我们需要对比两张图片的差异。可以使用 `ImageChops` 模块中的 `difference` 函数来计算两张图片的差异。这将返回一张新的图片,其中每个像素的值表示对应位置两张图片的像素点之间的差异。像素值为 0 表示两个像素点相同,非 0 值表示两个像素点不同。
```python
from PIL import Image, ImageChops
import os
# 两个文件夹路径
folder1 = 'path/to/folder1'
folder2 = 'path/to/folder2'
# 遍历文件夹中的图片
for filename in os.listdir(folder1):
if filename.endswith('.jpg'): # 假设图片格式为 jpg
# 读取图片
img1 = Image.open(os.path.join(folder1, filename))
img2 = Image.open(os.path.join(folder2, filename))
# 计算两张图片的差异
diff = ImageChops.difference(img1, img2)
# TODO: 根据差异大小标注差异位置
```
现在我们有了两张图片的差异图,接下来需要根据差异的大小来标注差异位置。根据题目要求,当像素点 RGB 对比差异大于 27 时,标注为红色,小于 5 时标注为蓝色。我们可以使用 `Image` 对象的 `getpixel` 和 `putpixel` 方法来获取和修改像素点的 RGB 值。
```python
from PIL import Image, ImageChops
import os
# 两个文件夹路径
folder1 = 'path/to/folder1'
folder2 = 'path/to/folder2'
# 遍历文件夹中的图片
for filename in os.listdir(folder1):
if filename.endswith('.jpg'): # 假设图片格式为 jpg
# 读取图片
img1 = Image.open(os.path.join(folder1, filename))
img2 = Image.open(os.path.join(folder2, filename))
# 计算两张图片的差异
diff = ImageChops.difference(img1, img2)
# 标注差异位置
for x in range(diff.width):
for y in range(diff.height):
# 获取像素点的 RGB 值
r, g, b = diff.getpixel((x, y))
# 判断差异大小并标注颜色
if r > 27 or g > 27 or b > 27:
img1.putpixel((x, y), (255, 0, 0)) # 标注为红色
elif r < 5 and g < 5 and b < 5:
img1.putpixel((x, y), (0, 0, 255)) # 标注为蓝色
# 保存标注后的图片
img1.save(os.path.join('path/to/output', filename))
```
最后,我们可以将标注后的图片保存到指定的文件夹中。这里假设输出文件夹为 `path/to/output`。
需要注意的是,上面的代码只对单个像素点的 RGB 值进行了对比,实际上可能需要考虑多个像素点的平均值或方差等统计量来进行差异判断。另外,由于像素点的颜色可能包含 alpha 通道,所以实际上需要对 RGBA 值进行对比。以上代码只是提供了一个大致的思路,具体实现需要根据实际情况进行调整。
阅读全文