当前位置:
首页 > Python基础教程 >
-
Python列表删除重复元素与图像相似度判断及删除实例代码
在Python中,处理列表以删除重复元素是一个相对简单的任务,但图像相似度判断并基于相似度删除图像(或图像文件路径)则涉及更复杂的图像处理技术。下面,我将分别提供两个部分的示例代码:
### 1. Python列表删除重复元素
### 2. 图像相似度判断及删除实例
对于图像相似度判断,我们可以使用OpenCV库来计算两张图像之间的结构相似度(SSIM)或直方图相似度。这里,我将以计算SSIM为例,并假设我们有一个图像列表,我们想要删除那些与列表中某一张图像相似度超过某个阈值的图像。
首先,你需要安装OpenCV库(如果还没有安装的话):
然后,你可以使用以下代码来比较图像并基于相似度删除图像:
**重要说明**:
- 上面的`ssim`函数实际上使用的是直方图相似度作为示例,因为直接使用SSIM(结构相似度)需要更复杂的处理,包括可能的图像缩放、转换到灰度(如果还未转换)以及使用`cv2.SSIM()`函数等。
- 真正的图像相似度判断可能需要根据你的具体需求进行调整,比如你可能需要考虑图像的颜色、纹理、形状等多种特征。
- 在处理大量图像时,计算相似度可能会非常耗时,因此你可能需要考虑使用并行处理或更高效的算法来优化性能。
最后,如果你对python语言还有任何疑问或者需要进一步的帮助,请访问https://www.xin3721.com 本站原创,转载请注明出处:https://www.xin3721.com/Python/python50317.html
### 1. Python列表删除重复元素
def remove_duplicates_from_list(lst):
"""使用集合去除列表中的重复元素,并保留原始顺序"""
seen = set()
unique_list = []
for item in lst:
if item not in seen:
seen.add(item)
unique_list.append(item)
return unique_list
# 示例
my_list = [1, 2, 2, 3, 4, 4, 5]
print(remove_duplicates_from_list(my_list))
"""使用集合去除列表中的重复元素,并保留原始顺序"""
seen = set()
unique_list = []
for item in lst:
if item not in seen:
seen.add(item)
unique_list.append(item)
return unique_list
# 示例
my_list = [1, 2, 2, 3, 4, 4, 5]
print(remove_duplicates_from_list(my_list))
### 2. 图像相似度判断及删除实例
对于图像相似度判断,我们可以使用OpenCV库来计算两张图像之间的结构相似度(SSIM)或直方图相似度。这里,我将以计算SSIM为例,并假设我们有一个图像列表,我们想要删除那些与列表中某一张图像相似度超过某个阈值的图像。
首先,你需要安装OpenCV库(如果还没有安装的话):
pip install opencv-python
然后,你可以使用以下代码来比较图像并基于相似度删除图像:
import cv2
import numpy as np
from os import listdir
from os.path import isfile, join
def ssim(img1, img2):
"""计算两张图像的SSIM"""
_, score = cv2.compareHist(cv2.calcHist([img1], [0], None, [256], [0, 256]), cv2.calcHist([img2], [0], None, [256], [0, 256]), cv2.HISTCMP_CORREL)
# 注意:这里我使用了直方图比较作为示例,因为SSIM通常不是通过比较直方图来计算的。
# 真正的SSIM计算需要使用cv2.SSIM()函数,但这里为了简化示例,我们使用直方图相似度。
return score
def remove_similar_images(image_paths, threshold=0.9):
"""删除相似度超过阈值的图像"""
images = {path: cv2.imread(path, cv2.IMREAD_GRAYSCALE) for path in image_paths if isfile(path)}
to_remove = set()
for i, (img1_path, img1) in enumerate(images.items()):
for j, (img2_path, img2) in enumerate(images.items()):
if i != j:
sim = ssim(img1, img2)
if sim > threshold:
to_remove.add(img2_path)
# 只保留未标记为删除的图像的路径
unique_images = [img_path for img_path in image_paths if img_path not in to_remove]
return unique_images
# 假设你有一个包含图像文件路径的列表
image_folder = 'path_to_images'
image_paths = [join(image_folder, f) for f in listdir(image_folder) if isfile(join(image_folder, f)) and f.endswith(('.png', '.jpg'))]
# 调用函数并打印结果
unique_images = remove_similar_images(image_paths, threshold=0.9)
print(unique_images)
# 注意:上面的ssim函数实际上使用的是直方图相似度作为示例,
# 真正的SSIM计算应该使用cv2.SSIM()函数,但该函数需要两张图像大小相同,并且通常用于比较图像块。
# 对于全图比较,你可能需要先将图像缩放到相同大小,然后可能需要在多个尺度上计算SSIM并取平均值。
import numpy as np
from os import listdir
from os.path import isfile, join
def ssim(img1, img2):
"""计算两张图像的SSIM"""
_, score = cv2.compareHist(cv2.calcHist([img1], [0], None, [256], [0, 256]), cv2.calcHist([img2], [0], None, [256], [0, 256]), cv2.HISTCMP_CORREL)
# 注意:这里我使用了直方图比较作为示例,因为SSIM通常不是通过比较直方图来计算的。
# 真正的SSIM计算需要使用cv2.SSIM()函数,但这里为了简化示例,我们使用直方图相似度。
return score
def remove_similar_images(image_paths, threshold=0.9):
"""删除相似度超过阈值的图像"""
images = {path: cv2.imread(path, cv2.IMREAD_GRAYSCALE) for path in image_paths if isfile(path)}
to_remove = set()
for i, (img1_path, img1) in enumerate(images.items()):
for j, (img2_path, img2) in enumerate(images.items()):
if i != j:
sim = ssim(img1, img2)
if sim > threshold:
to_remove.add(img2_path)
# 只保留未标记为删除的图像的路径
unique_images = [img_path for img_path in image_paths if img_path not in to_remove]
return unique_images
# 假设你有一个包含图像文件路径的列表
image_folder = 'path_to_images'
image_paths = [join(image_folder, f) for f in listdir(image_folder) if isfile(join(image_folder, f)) and f.endswith(('.png', '.jpg'))]
# 调用函数并打印结果
unique_images = remove_similar_images(image_paths, threshold=0.9)
print(unique_images)
# 注意:上面的ssim函数实际上使用的是直方图相似度作为示例,
# 真正的SSIM计算应该使用cv2.SSIM()函数,但该函数需要两张图像大小相同,并且通常用于比较图像块。
# 对于全图比较,你可能需要先将图像缩放到相同大小,然后可能需要在多个尺度上计算SSIM并取平均值。
**重要说明**:
- 上面的`ssim`函数实际上使用的是直方图相似度作为示例,因为直接使用SSIM(结构相似度)需要更复杂的处理,包括可能的图像缩放、转换到灰度(如果还未转换)以及使用`cv2.SSIM()`函数等。
- 真正的图像相似度判断可能需要根据你的具体需求进行调整,比如你可能需要考虑图像的颜色、纹理、形状等多种特征。
- 在处理大量图像时,计算相似度可能会非常耗时,因此你可能需要考虑使用并行处理或更高效的算法来优化性能。
最后,如果你对python语言还有任何疑问或者需要进一步的帮助,请访问https://www.xin3721.com 本站原创,转载请注明出处:https://www.xin3721.com/Python/python50317.html
栏目列表
最新更新
求1000阶乘的结果末尾有多少个0
详解MyBatis延迟加载是如何实现的
IDEA 控制台中文乱码4种解决方案
SpringBoot中版本兼容性处理的实现示例
Spring的IOC解决程序耦合的实现
详解Spring多数据源如何切换
Java报错:UnsupportedOperationException in Col
使用Spring Batch实现批处理任务的详细教程
java中怎么将多个音频文件拼接合成一个
SpringBoot整合ES多个精确值查询 terms功能实
SQL Server 中的数据类型隐式转换问题
SQL Server中T-SQL 数据类型转换详解
sqlserver 数据类型转换小实验
SQL Server数据类型转换方法
SQL Server 2017无法连接到服务器的问题解决
SQLServer地址搜索性能优化
Sql Server查询性能优化之不可小觑的书签查
SQL Server数据库的高性能优化经验总结
SQL SERVER性能优化综述(很好的总结,不要错
开启SQLSERVER数据库缓存依赖优化网站性能
uniapp/H5 获取手机桌面壁纸 (静态壁纸)
[前端] DNS解析与优化
为什么在js中需要添加addEventListener()?
JS模块化系统
js通过Object.defineProperty() 定义和控制对象
这是目前我见过最好的跨域解决方案!
减少回流与重绘
减少回流与重绘
如何使用KrpanoToolJS在浏览器切图
performance.now() 与 Date.now() 对比