python读取一个文件夹中的图片,每读取一张都要计算其均值哈希值,并与前面每图片的均值哈希值比较,如果不同的数量小于5,则认为它们相同,选其一保留
时间: 2024-04-22 12:21:45 浏览: 142
好的,我来给你讲一下如何实现这个功能。
首先,你需要用Python的os模块遍历指定文件夹中的所有图片文件,并用PIL库读取图片并计算其均值哈希值。可以使用下面的代码实现:
```python
import os
from PIL import Image
# 计算均值哈希值
def calc_avg_hash(img):
# 缩放为8*8的小图
img = img.resize((8, 8), Image.ANTIALIAS).convert('L')
# 计算像素平均值
avg = sum(list(img.getdata())) / 64
# 生成哈希值
hash_str = ''
for i in img.getdata():
if i > avg:
hash_str += '1'
else:
hash_str += '0'
return hash_str
# 遍历文件夹中的所有图片,并计算哈希值
def get_image_hash(folder):
image_hash = []
for filename in os.listdir(folder):
if filename.endswith('.jpg') or filename.endswith('.png'):
filepath = os.path.join(folder, filename)
img = Image.open(filepath)
hash_str = calc_avg_hash(img)
image_hash.append((filename, hash_str))
return image_hash
```
接下来,你需要对每张图片的哈希值进行比较,如果有5张以上的图片与当前图片相似,则认为它们是相同的图片,选其中一张保留。可以使用下面的代码实现:
```python
# 比较哈希值是否相似
def is_hash_similar(hash1, hash2, n):
diff = 0
for i in range(len(hash1)):
if hash1[i] != hash2[i]:
diff += 1
return diff < n
# 去除相似图片
def remove_similar_images(image_hash):
result = []
for i in range(len(image_hash)):
is_similar = False
for j in range(i):
if is_hash_similar(image_hash[i][1], image_hash[j][1], 5):
is_similar = True
break
if not is_similar:
result.append(image_hash[i])
return result
```
最后,你可以将去重后的图片保存到指定文件夹中。可以使用下面的代码实现:
```python
# 保存图片
def save_images(image_hash, folder):
for filename, _ in image_hash:
filepath = os.path.join(folder, filename)
new_filepath = os.path.join(folder + '_new', filename)
os.rename(filepath, new_filepath)
# 主函数
if __name__ == '__main__':
folder = 'image_folder'
image_hash = get_image_hash(folder)
image_hash = remove_similar_images(image_hash)
save_images(image_hash, folder)
```
这样,就完成了从文件夹中读取图片并去重的功能。希望能帮到你!
阅读全文