图像预处理之图像去重

简介: 图像预处理之图像去重

图像去重


介绍


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


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


方法


1.哈希法:通过计算图像的散列值来识别重复图像。


2.图像比对法:通过对图像的直方图或灰度共生矩阵等特征进行比对来识别重复图像。


3.机器学习法:通过训练机器学习模型来识别重复图像,例如使用卷积神经网络(CNN)。


4.特征提取法:通过提取图像的特征,例如 SIFT 等,并将其映射到一个空间中,以识别重复图像。


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


基于直方图进行图像比对

import cv2
import numpy as np
def 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 hashlib
def calculate_hash(image):
    # 调整图像大小
    image = cv2.resize(image, (9, 8), interpolation = cv2.INTER_CUBIC)
    # 转换为灰度图像
    gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
    # 计算哈希值
    hash_value = 0
    for 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 cv2
def 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 np
def 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_path
            except:
                pass
    return duplicates
dp = find_duplicates('data')
print(dp)
目录
相关文章
|
JSON 数据格式 Python
对Labelme标注图像,进行90、180、270的旋转,实现标注数据的扩充。
对Labelme标注图像,进行90、180、270的旋转,实现标注数据的扩充。
1117 0
对Labelme标注图像,进行90、180、270的旋转,实现标注数据的扩充。
|
26天前
|
机器学习/深度学习 计算机视觉 Python
图像数据的特征提取与预处理方法,涵盖图像数据的特点、主要的特征提取技术
本文深入探讨了图像数据的特征提取与预处理方法,涵盖图像数据的特点、主要的特征提取技术(如颜色、纹理、形状特征)及预处理步骤(如图像增强、去噪、分割)。同时介绍了Python中常用的OpenCV和Scikit-image库,并提供了代码示例,强调了预处理的重要性及其在提升模型性能中的作用。
111 5
|
2月前
|
数据采集
遥感语义分割数据集中的切图策略
该脚本用于遥感图像的切图处理,支持大尺寸图像按指定大小和步长切割为多个小图,适用于语义分割任务的数据预处理。通过设置剪裁尺寸(cs)和步长(ss),可灵活调整输出图像的数量和大小。此外,脚本还支持标签图像的转换,便于后续模型训练使用。
23 0
|
4月前
|
机器学习/深度学习 Python
图像预处理
【8月更文挑战第4天】图像预处理。
48 9
|
4月前
分割数据集,并对数据集进行预处理
【8月更文挑战第8天】分割数据集,并对数据集进行预处理。
39 1
|
存储 传感器 数据可视化
3D目标检测数据集 KITTI(标签格式解析、3D框可视化、点云转图像、BEV鸟瞰图)
本文介绍在3D目标检测中,理解和使用KITTI 数据集,包括KITTI 的基本情况、下载数据集、标签格式解析、3D框可视化、点云转图像、画BEV鸟瞰图等,并配有实现代码。
1800 1
|
7月前
图像表示方法
图像表示方法
64 0
|
机器学习/深度学习 人工智能 文字识别
OpenCV-字典法实现数字识别(尺寸归一化+图像差值)
OpenCV-字典法实现数字识别(尺寸归一化+图像差值)
122 0
|
存储 编解码 对象存储
将图像标记器多边形转换为标记的块图像以进行语义分割
将存储在对象中的多边形标签转换为适用于语义分割工作流的标记阻止图像。 可以使用计算机视觉工具箱中的图像标记器应用来标记太大而无法放入内存和多分辨率图像的图像。有关详细信息,请参阅在图像标记器(计算机视觉工具箱)中标记大图像。图像标记器应用不支持对被阻止的图像进行像素标记。您只能使用 ROI 形状(如多边形、矩形和线条)创建标签。此示例演示如何使用函数将多边形 ROI 转换为像素标记的块图像,以进行语义分割工作流。
76 0
将图像标记器多边形转换为标记的块图像以进行语义分割
|
存储 机器学习/深度学习 编解码
使用训练分类网络预处理多分辨率图像
说明如何准备用于读取和预处理可能不适合内存的多分辨率全玻片图像 (WSI) 的数据存储。肿瘤分类的深度学习方法依赖于数字病理学,其中整个组织切片被成像和数字化。生成的 WSI 具有高分辨率,大约为 200,000 x 100,000 像素。WSI 通常以多分辨率格式存储,以促进图像的高效显示、导航和处理。 读取和处理WSI数据。这些对象有助于使用多个分辨率级别,并且不需要将图像加载到核心内存中。此示例演示如何使用较低分辨率的图像数据从较精细的级别有效地准备数据。可以使用处理后的数据来训练分类深度学习网络。
350 0