图像预处理之图像去重

news/2024/4/19 22:50:57/文章来源:https://blog.csdn.net/qq128252/article/details/128947233

图像预处理之图像去重

  • 图像去重
    • 介绍
    • 方法
    • 基于直方图进行图像比对
    • 基于哈希法
    • 基于ORG进行图像特征提取
    • 基于机器学习
    • 批量去重

图像去重

介绍

图像去重通常指的是完全相同的图像,即内容完全相同,颜色、尺寸、方向等都相同。但是在实际应用中,也有相似图像去重的需求,即内容大致相同,颜色、尺寸、方向等可能有所不同。因此,图像去重指的可以是完全一样的图像,也可以是相似的图像。

图像去重的方法有以下几种:

方法

  1. 哈希法:通过计算图像的散列值来识别重复图像。
  2. 图像比对法:通过对图像的直方图或灰度共生矩阵等特征进行比对来识别重复图像。
  3. 机器学习法:通过训练机器学习模型来识别重复图像,例如使用卷积神经网络(CNN)。
  4. 特征提取法:通过提取图像的特征,例如 SIFT 等,并将其映射到一个空间中,以识别重复图像。

这些方法的选择取决于图像去重的具体需求和数据的特征。

基于直方图进行图像比对

import cv2
import numpy as npdef compare_images(image1, image2):# 计算图像的直方图hist1 = cv2.calcHist([image1], [0], None, [256], [0, 256])hist2 = cv2.calcHist([image2], [0], None, [256], [0, 256])# 计算直方图的相似度similarity = cv2.compareHist(hist1, hist2, cv2.HISTCMP_CORREL)return similarity# 读入两张图片
img1 = cv2.imread('image1.jpg')
img2 = cv2.imread('image2.jpg')# 计算两张图片的相似度
similarity = compare_images(img1, img2)# 根据相似度判断图片是否重复
if similarity > 0.95:print("Images are duplicates")
else:print("Images are not duplicates")

基于哈希法

import cv2
import hashlibdef calculate_hash(image):# 调整图像大小image = cv2.resize(image, (9, 8), interpolation = cv2.INTER_CUBIC)# 转换为灰度图像gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)# 计算哈希值hash_value = 0for i in range(8):for j in range(8):if gray[i, j] > gray[i, j + 1]:hash_value += 1 << (i * 8 + j)return hash_value# 读入两张图片
img1 = cv2.imread('image1.jpg')
img2 = cv2.imread('image2.jpg')# 计算图片的哈希值
hash1 = calculate_hash(img1)
hash2 = calculate_hash(img2)# 判断图片是否重复
if hash1 == hash2:print("Images are duplicates")
else:print("Images are not duplicates")

基于ORG进行图像特征提取

import cv2def extract_features(image):# 使用 ORB 算法提取图像的特征点orb = cv2.ORB_create()keypoints, descriptors = orb.detectAndCompute(image, None)return keypoints, descriptors# 读入两张图片
img1 = cv2.imread('image1.jpg')
img2 = cv2.imread('image2.jpg')# 提取图像的特征点和描述符
kp1, des1 = extract_features(img1)
kp2, des2 = extract_features(img2)# 匹配两张图片的特征点
bf = cv2.BFMatcher(cv2.NORM_HAMMING, crossCheck = True)
matches = bf.match(des1, des2)# 计算匹配到的特征点数量
match_count = len(matches)# 判断图片是否重复
if match_count > 10:print("Images are duplicates")
else:print("Images are not duplicates")

基于机器学习

import cv2
import numpy as np
from sklearn.neighbors import KNeighborsClassifier# Load the images and resize them to a fixed size
images = []
labels = []
for i in range(10):img = cv2.imread(f'image_{i}.jpg')img = cv2.resize(img, (128, 128))images.append(img)labels.append(i % 5)# Extract features from the images using a feature extractor
def extract_features(images):features = []for img in images:hist = cv2.calcHist([img], [0, 1, 2], None, [8, 8, 8], [0, 256, 0, 256, 0, 256])hist = hist.flatten()features.append(hist)return np.array(features)features = extract_features(images)# Train a KNN classifier on the features
clf = KNeighborsClassifier(n_neighbors=1)
clf.fit(features, labels)# Use the classifier to predict the label of a new image
new_img = cv2.imread('new_image.jpg')
new_img = cv2.resize(new_img, (128, 128))
new_features = extract_features([new_img])
predicted_label = clf.predict(new_features)

批量去重

import os
import cv2
import numpy as npdef calc_hist(image):"""Calculate the histogram of an image."""hist = cv2.calcHist([image], [0], None, [256], [0, 256])return hist.flatten()def find_duplicates(path):"""Find duplicate images in a directory."""image_hashes = {}duplicates = []for filename in os.listdir(path):file_path = os.path.join(path, filename)if os.path.isfile(file_path):try:image = cv2.imread(file_path, 0)hist = calc_hist(image)hash = np.array_str(hist)if hash in image_hashes:duplicates.append((file_path, image_hashes[hash]))else:image_hashes[hash] = file_pathexcept:passreturn duplicatesdp = find_duplicates('data')
print(dp)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_255789.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

微服务--Gateway网关学习

Gateway服务网关 为什么需要网关 网关功能&#xff1a; 身份认证和权限校验服务路由&#xff0c;负载均衡请求限流 网关的技术实现&#xff1a;在SpringCloud网关的实现包括两种&#xff1a; gatewayzuul Zuul是基于Servlet的实现&#xff0c;属于阻塞式编程。而SpringCloudGa…

车道线检测-E2E_LSFitting 论文学习笔记

论文&#xff1a;《End-to-end Lane Detection through Differentiable Least-Squares Fitting》 代码&#xff1a;https://github.com/wvangansbeke/LaneDetection_End2End 材料&#xff1a;https://zhuanlan.zhihu.com/p/94419168 特点&#xff1a; 拟合二次曲线&#xff1b…

专家说年轻人工资低是能力不行….

我们国家的很多专家总讲究语不惊人死不休&#xff0c;同时他们还很喜欢话风高速原地调头。 最近又有一个碉堡了的专家在大放厥词&#xff0c;就在前几天的首届长白山高峰论坛上中航基金副总经理邓海清发表批评年轻人的言论&#xff0c;邓老板是这么说的&#xff1a;很多年轻人…

synchronized 关键字-监视器锁 monitor lock

1.代码示例&#xff1a; package thread3;import java.util.Scanner;public class Test2 {public static Object object new Object();public static void main(String[] args) throws InterruptedException {Thread thread1 new Thread(() -> {Scanner scanner new Sca…

第五十一章 BFS进阶(一)——双端队列广搜

第五十一章 BFS进阶&#xff08;一&#xff09;——双端队列广搜一、原理二、例题1、问题2、分析三、代码一、原理 在介绍双端队列广搜之前&#xff0c;我们先回顾一下堆优化版本的dijkstradijkstradijkstra算法。 在这个算法中&#xff0c;我们使用的是小根堆来找到距离起点…

Windows/VM虚拟机安装黑群晖6.1-----保证有效而且简单操作

1视频&#xff1a;Windows/VM虚拟机安装黑群晖教程_哔哩哔哩_bilibili2:网址&#xff1a;Synology Web Assistant3&#xff1a;重新打开群晖操作步骤1&#xff1a;按着视频下载好资源后&#xff0c;按照视频操作&#xff0c;途中修改地方&#xff08;两个情况选择其中一个&…

Flowable进阶学习(九)数据对象DataObject、租户Tenant、接收任务ReceiveTask

文章目录一、数据对象DataObject二、租户 Tenant三、接收任务 ReceiveTask案例一、数据对象DataObject DataObject可以⽤来定义⼀些流程的全局属性。 绘制流程图&#xff0c;并配置数据对象&#xff08;不需要选择任意节点&#xff09; 2. 编码与测试 /*** 部署流程*/ Test…

函数/任意波形发生器 DG5072 技术资料

函数/任意波形发生器 DG5072 DG5000人性化的界面设计和键盘布局&#xff0c;给用户带来非凡体验&#xff1b;丰富的标准配置接口&#xff0c;可轻松实现仪器远程控制&#xff0c;为用户提供更多解决方案。 产品特性 4.3英寸16M真彩TFT液晶显示屏 350 MHz、250MHz、100 MHz或70…

微信卸载后重装的聊天记录还能找回吗?

很多人微信卸载后&#xff0c;问能不能恢复之前的聊天记录&#xff1f; 我想大家肯定都去百度搜索了&#xff0c;能搜出来可行的办法了么&#xff0c;没有是吧&#xff0c;那就看看我能不能帮到你&#xff0c;根据我的经验来解决。 答&#xff1a;理论上是不能的&#xff0c;因…

详细聊聊spring核心思想

犹记我当年初学 Spring 时&#xff0c;还需写一个个 XML 文件&#xff0c;当时心里不知所以然&#xff0c;跟着网上的步骤一个一个配置下来&#xff0c;配错一个看着 error 懵半天&#xff0c;不知所谓地瞎改到最后能跑就行&#xff0c;暗自感叹 tmd 这玩意真复杂。 到后来用上…

C语言入门教程||C语言 循环||C语言 函数

C语言 循环有的时候&#xff0c;可能需要多次执行同一块代码。一般情况下&#xff0c;语句是顺序执行的&#xff1a;函数中的第一个语句先执行&#xff0c;接着是第二个语句&#xff0c;依此类推。编程语言提供了允许更为复杂的执行路径的多种控制结构。循环语句允许我们多次执…

【Django】云笔记项目

一、介绍 用户可在系统中记录自己的笔记&#xff0c;用户的数据被存储在云笔记平台&#xff1b;用户和用户之间的数据为隔离存储&#xff08;登陆后才能使用相关笔记功能&#xff0c;且只能查阅自己的笔记&#xff09; 二、功能拆解 1、用户模块 注册&#xff1a;成为平台…

【Java 面试合集】简述下自定义异常的应用场景

简述下自定义异常的应用场景 1. 概述 如上图所示&#xff0c;我们想回答这个问题就要了解异常的基本结构。哪些是我们可以控制的&#xff0c;哪些是我们不能控制的。 也许有人会问了&#xff0c;其实在逻辑中可以多加判断&#xff0c;为什么要需要自定义呢。 其实判断的内容无…

跳跃游戏 II 解析

题目描述给定一个长度为 n 的 0 索引整数数组 nums。初始位置为 nums[0]。每个元素 nums[i] 表示从索引 i 向前跳转的最大长度。换句话说&#xff0c;如果你在 nums[i] 处&#xff0c;你可以跳转到任意 nums[i j] 处:0 < j < nums[i] i j < n返回到达 nums[n - 1] 的…

【i2c协议介绍】

文章目录协议简单介绍五种速度模式master/slave和transmitter/receiver关系第一种情况&#xff1a;master作为transmitter&#xff0c;slave作为receiver第二种情况&#xff1a;当master作为receiver&#xff0c;slave作为transmitteri2c基本信号start产生stop信号数据传输有效…

基于OpenCV 的车牌识别

基于OpenCV 的车牌识别 车牌识别是一种图像处理技术&#xff0c;用于识别不同车辆。这项技术被广泛用于各种安全检测中。现在让我一起基于 OpenCV 编写 Python 代码来完成这一任务。 车牌识别的相关步骤 1. 车牌检测&#xff1a;第一步是从汽车上检测车牌所在位置。我们将使用…

《Spring揭秘》记录

IOC部分 IOC不等于IOC容器&#xff0c;即使不使用spring&#xff0c;我们也可以使用IOC&#xff0c;只不过spring提供了IOC容器实现。Spring的IoC容器的功能就包含一个提供依赖注入服务的IoC Service Provider。它提供两方面的支持&#xff0c;业务对象的构建管理和业务对象间的…

python读取.stl文件

目录 .1 文本方式读取 1.2 stl解析 1.3 stl创建 .2 把点转换为.stl .1 文本方式读取 代码如下 stl_path/home/pxing/codes/point_improve/data/003_cracker_box/0.stlpoints[] f open(stl_path) lines f.readlines() prefixvertex num3 for line in lines:#print (l…

《里奥哈酒友记》 | 里奥哈的历史—品鉴瑞格尔侯爵葡萄酒

2022年末&#xff0c;里奥哈大使组合怪怪和思羽完成了里奥哈线上活动两大“壮举”&#xff0c;10期《里奥哈酒友记》系列视频和40集《美酒之乡——里奥哈》有声专辑&#xff0c;吸引了许多葡萄酒资深爱好者的目光&#xff0c;也成功地让更多的人了解到里奥哈。由里奥哈推广大使…

windows无法访问指定设备路径或文件怎么办?2个解决方案

有时候Win10电脑打不开程序或文件&#xff0c;windows无法访问指定设备路径或文件该怎么办&#xff1f;原因是什么呢&#xff1f;一般导致这种情况的出现&#xff0c;大多是因为我们的电脑缺乏相应的查看权限&#xff0c;我们只需要通过赋予权限就可以解决这个难题了。 操作环境…