gpt4 book ai didi

python - 检查是否有与输入图像完全相同的图像

转载 作者:行者123 更新时间:2023-12-01 01:42:59 25 4
gpt4 key购买 nike

我想知道如何在海量数据中查找图像(文件夹中有很多图像)并且我想查找完全正确的图像与输入图像相同(给定来自不在数据文件夹中的另一个文件夹的输入图像)并将输入图像与所有海量数据进行比较,如果发现完全相同的图像,则将其名称显示为输出(文件夹中的相同图像,不输入名称)(例如:dafs.jpg)

使用Python

我正在考虑比较 RGB 像素的精确值并从文件夹中的每个图像中减去输入图像的像素

但我不知道如何在 python 中做到这一点

最佳答案

比较 RGB 像素值

您可以使用pillow模块来访问特定图像的像素数据。请记住,pillow 支持 these image formats .

如果我们根据您的描述对两个图像相同的含义做出一些假设,则两个图像必须:

  • 具有相同的尺寸(高度和宽度)
  • 具有相同的 RGB 像素值(输入图像中像素 [x, y] 的 RGB 值必须与输出图像中像素 [x, y] 的 RGB 值相同)
  • 方向相同(与之前的假设相关,图像被认为与旋转 90 度的同一图像不同)

那么如果我们有 2 个使用 pillow 模块的图像

from PIL import Image

original = Image.open("input.jpg")
possible_duplicate = Image.open("output.jpg")

以下代码将能够比较两个图像以查看它们是否相同

def compare_images(input_image, output_image):
# compare image dimensions (assumption 1)
if input_image.size != output_image.size:
return False

rows, cols = input_image.size

# compare image pixels (assumption 2 and 3)
for row in range(rows):
for col in range(cols):
input_pixel = input_image.getpixel((row, col))
output_pixel = output_image.getpixel((row, col))
if input_pixel != output_pixel:
return False

return True

通过调用

compare_images(original, possible_duplicate)

使用这个函数,我们可以浏览一组图像

from PIL import Image

def find_duplicate_image(input_image, output_images):
# only open the input image once
input_image = Image.open(input_image)

for image in output_images:
if compare_images(input_image, Image.open(image)):
return image

把它们放在一起,我们可以简单地调用

original = "input.jpg"
possible_duplicates = ["output.jpg", "output2.jpg", ...]

duplicate = find_duplicate_image(original, possible_duplicates)

请注意,上述实现只会找到第一个重复项,然后将其返回。如果没有找到重复项,将返回 None

需要记住的一件事是,对每个像素进行这样的比较可能成本高昂。我用过this image并使用 timeit 将此作为输入和输出运行 compare_images 100 次模块,并取所有这些运行的平均值

num_trials = 100
trials = timeit.repeat(
repeat=num_trials,
number=1,
stmt="compare_images(Image.open('input.jpg'), Image.open('input.jpg'))",
setup="from __main__ import compare_images; from PIL import Image"
)
avg = sum(trials) / num_trials

print("Average time taken per comparison was:", avg, "seconds")

# Average time taken per comparison was 1.3337286046380177 seconds

请注意,这是在只有 600 x 600 像素的图像上完成的。如果您使用一组可能重复的“大量”图像执行此操作,其中“大量”是指至少 100 万张类似尺寸的图像,这可能需要大约 15 天(1,000,000 * 1.28 秒/60 秒/60 分钟)/24 小时)检查每个输出图像并将其与输入进行比较,这并不理想。

另请记住,这些指标会根据您使用的计算机和操作系统的不同而有所不同。我提供的数字更多的是用于说明目的。

替代实现

虽然我自己还没有完全探索这个实现,但您可以尝试的一种方法是使用 hash function 预先计算集合中每个图像的像素数据的哈希值。 。如果您将这些存储在数据库中,每个散列都包含原始图像或图像名称的链接,那么您所要做的就是使用相同的散列函数计算输入图像的散列,然后比较散列。这将节省大量的计算时间,并且会产生更高效的算法。

This blog post描述了执行此操作的一种实现。

更新 - 2018-08-06

根据OP的请求,如果您获得了可能重复图像的目录,而不是显式图像路径本身,那么您可以使用osntpath像这样的模块

import ntpath
import os

def get_all_images(directory):
image_paths = []

for filename in os.listdir(directory):
# to be as careful as possible, you might check to make sure that
# the file is in fact an image, for instance using
# filename.endswith(".jpg") to check for .jpg files for instance
image_paths.append("{}/{}".format(directory, filename))

return image_paths

def get_filename(path):
return ntpath.basename(path)

使用这些函数,更新后的程序可能如下所示

possible_duplicates = get_all_images("/path/to/images")
duplicate_path = find_duplicate_image("/path/to/input.jpg", possible_duplicates)
if duplicate_path:
print(get_filename(duplicate_path))

如果存在重复,上面只会打印重复图像的名称,否则,不会打印任何内容。

关于python - 检查是否有与输入图像完全相同的图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51688179/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com