- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我想知道如何在海量数据中查找图像(文件夹中有很多图像)并且我想查找完全正确的图像与输入图像相同(给定来自不在数据文件夹中的另一个文件夹的输入图像)并将输入图像与所有海量数据进行比较,如果发现完全相同的图像,则将其名称显示为输出(文件夹中的相同图像,不输入名称)(例如:dafs.jpg)
使用Python
我正在考虑比较 RGB 像素的精确值并从文件夹中的每个图像中减去输入图像的像素
但我不知道如何在 python 中做到这一点
最佳答案
您可以使用pillow模块来访问特定图像的像素数据。请记住,pillow
支持 these image formats .
如果我们根据您的描述对两个图像相同的含义做出一些假设,则两个图像必须:
那么如果我们有 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描述了执行此操作的一种实现。
根据OP的请求,如果您获得了可能重复图像的目录,而不是显式图像路径本身,那么您可以使用os
和ntpath
像这样的模块
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/
我正在处理一组标记为 160 个组的 173k 点。我想通过合并最接近的(到 9 或 10 个组)来减少组/集群的数量。我搜索过 sklearn 或类似的库,但没有成功。 我猜它只是通过 knn 聚类
我有一个扁平数字列表,这些数字逻辑上以 3 为一组,其中每个三元组是 (number, __ignored, flag[0 or 1]),例如: [7,56,1, 8,0,0, 2,0,0, 6,1,
我正在使用 pipenv 来管理我的包。我想编写一个 python 脚本来调用另一个使用不同虚拟环境(VE)的 python 脚本。 如何运行使用 VE1 的 python 脚本 1 并调用另一个 p
假设我有一个文件 script.py 位于 path = "foo/bar/script.py"。我正在寻找一种在 Python 中通过函数 execute_script() 从我的主要 Python
这听起来像是谜语或笑话,但实际上我还没有找到这个问题的答案。 问题到底是什么? 我想运行 2 个脚本。在第一个脚本中,我调用另一个脚本,但我希望它们继续并行,而不是在两个单独的线程中。主要是我不希望第
我有一个带有 python 2.5.5 的软件。我想发送一个命令,该命令将在 python 2.7.5 中启动一个脚本,然后继续执行该脚本。 我试过用 #!python2.7.5 和http://re
我在 python 命令行(使用 python 2.7)中,并尝试运行 Python 脚本。我的操作系统是 Windows 7。我已将我的目录设置为包含我所有脚本的文件夹,使用: os.chdir("
剧透:部分解决(见最后)。 以下是使用 Python 嵌入的代码示例: #include int main(int argc, char** argv) { Py_SetPythonHome
假设我有以下列表,对应于及时的股票价格: prices = [1, 3, 7, 10, 9, 8, 5, 3, 6, 8, 12, 9, 6, 10, 13, 8, 4, 11] 我想确定以下总体上最
所以我试图在选择某个单选按钮时更改此框架的背景。 我的框架位于一个类中,并且单选按钮的功能位于该类之外。 (这样我就可以在所有其他框架上调用它们。) 问题是每当我选择单选按钮时都会出现以下错误: co
我正在尝试将字符串与 python 中的正则表达式进行比较,如下所示, #!/usr/bin/env python3 import re str1 = "Expecting property name
考虑以下原型(prototype) Boost.Python 模块,该模块从单独的 C++ 头文件中引入类“D”。 /* file: a/b.cpp */ BOOST_PYTHON_MODULE(c)
如何编写一个程序来“识别函数调用的行号?” python 检查模块提供了定位行号的选项,但是, def di(): return inspect.currentframe().f_back.f_l
我已经使用 macports 安装了 Python 2.7,并且由于我的 $PATH 变量,这就是我输入 $ python 时得到的变量。然而,virtualenv 默认使用 Python 2.6,除
我只想问如何加快 python 上的 re.search 速度。 我有一个很长的字符串行,长度为 176861(即带有一些符号的字母数字字符),我使用此函数测试了该行以进行研究: def getExe
list1= [u'%app%%General%%Council%', u'%people%', u'%people%%Regional%%Council%%Mandate%', u'%ppp%%Ge
这个问题在这里已经有了答案: Is it Pythonic to use list comprehensions for just side effects? (7 个答案) 关闭 4 个月前。 告
我想用 Python 将两个列表组合成一个列表,方法如下: a = [1,1,1,2,2,2,3,3,3,3] b= ["Sun", "is", "bright", "June","and" ,"Ju
我正在运行带有最新 Boost 发行版 (1.55.0) 的 Mac OS X 10.8.4 (Darwin 12.4.0)。我正在按照说明 here构建包含在我的发行版中的教程 Boost-Pyth
学习 Python,我正在尝试制作一个没有任何第 3 方库的网络抓取工具,这样过程对我来说并没有简化,而且我知道我在做什么。我浏览了一些在线资源,但所有这些都让我对某些事情感到困惑。 html 看起来
我是一名优秀的程序员,十分优秀!