文章目录

  • 前言
  • 一、代码
  • 二、结果展示

前言

摄影师小刘爱好摄影,有许多照片(不同格式,不同分辨率),有的是自己拍摄的,有的是朋友的相机帮忙拍到的。
但他很苦恼,因为有很多照片是类似的(比如,稍微偏了一点角度),请用程序帮他把类似的图片挑选出来。
提示:利用opencv将图片变成统一大小的尺寸,用特征相似度进行判断。可以多个同学共同构成数据集(>100幅)


一、代码

import os
import shutil
import random
import cv2
import numpy as np#定义resize维度
dim = 32
dim_sqr = dim*dim#源数据集文件夹路径
path_data = './data'
#数据处理后的目录
deter_exam = './pro_data/Fruits-all-examples/'
deter_flag = './pro_data/Fruits-all-flag/'
#将数据打乱文件夹目录
deter_exam_2 = './pro_data/Fruits-all-examples_2'#将数据集划分为flag和exam两部分
def data_procss(root_path,exam,flag):# 根目录下的所有一级目录,以列表形式赋给first_dirfirst_dir = os.listdir(root_path)# 遍历每一个一级目录for first in first_dir:# 一级目录绝对路径dir = root_path + '/' + str(first)# 得到一级目录下的二级目录imgs = os.listdir(dir)sample = random.sample(imgs, 1)  # 每个文件夹随机选取1张图片作为flagshutil.copyfile(dir + '/' + str(sample[0]), flag + str(sample[0]))# 遍历每幅图片for img in imgs:source_img = dir + '/' + str(img)detern = exam + str(img)shutil.copyfile(source_img, detern)#对数据集进行重命名,方便后续遍历循环
def data_rename(path):filelist = os.listdir(path)  # 获取指定的文件夹包含的文件或文件夹的名字的列表i = 0  # 图片名字从 0 开始for item in filelist:  # 遍历这个文件夹下的文件,即 图片if item.endswith('.jpg'):src = os.path.join(os.path.abspath(path), item)dst = os.path.join(os.path.abspath(path), str(i) + '.jpg')try:os.rename(src, dst)i = i + 1except:continue#将exam打乱,提高程序可行性
def data_shulffe(image_dir,result_dir):img_name_list = os.listdir(image_dir)if not os.path.exists(result_dir):os.makedirs(result_dir)# 创建随机数random_len = len(img_name_list)img_index = [i for i in range(random_len)]random.shuffle(img_index)# 开始转移每个文件for i, img in enumerate(img_name_list):dot_index = img.find('.')if dot_index > 0:img_name = str(img_index[i]) + img[dot_index:]shutil.copyfile(image_dir + img, result_dir + img_name)#均值哈希算法
def aHash(image):#将图片缩小到32x32的尺寸,总共32*32个像素。这一步的作用是去除图片的细节,只保留结构、明暗等基本信息,摒弃不同尺寸、比例带来的图片差异。image=cv2.resize(image,(dim,dim),interpolation=cv2.INTER_CUBIC)#转换为灰度图image=cv2.cvtColor(image,cv2.COLOR_BGR2GRAY)#计算所有32*32个像素的灰度平均值avreage = np.mean(image)#将每个像素的灰度,与平均值进行比较。大于或等于平均值,记为1;小于平均值,记为0。hash = []for i in range(image.shape[0]):for j in range(image.shape[1]):if image[i,j] > avreage:hash.append(1)else:hash.append(0)return hash#计算汉明距离
def Hamming_distance(hash1,hash2):num = 0#得到两张图片的指纹信息后,计算两组32*32位数据的汉明距离,即对比数据不同的位数,不同位数越少,表明图片的相似度越大。for index in range(len(hash1)):if hash1[index] != hash2[index]:num += 1return num#对打乱的exam数据集进行分类
def data_classify():for i in range(4):img1=cv2.imread(deter_flag + "/{}.jpg".format(i))hash1 = aHash(img1)data_path = os.path.join('Fruits-' + str(i))  # 分类后图片文件夹路径if not os.path.exists(data_path):  # 判断文件夹是否存在os.makedirs(data_path)  # 不存在则新建文件夹for j in range(104):img2 = cv2.imread(deter_exam_2 + "/{}.jpg".format(j))hash2 = aHash(img2)n = Hamming_distance(hash1, hash2)similarity = 1 - n * 1.0 / dim_sqr  #将距离转化为相似度print("flag中第{}张图片与exam中第{}张图片相似度为:{}".format(i,j,similarity))if (similarity > 0.80):cv2.imwrite('./' + data_path + '/' + '{}.jpg'.format(j), img2)if __name__ == '__main__':data_procss(path_data, deter_exam, deter_flag)data_rename(deter_exam)data_rename(deter_flag)data_shulffe(deter_exam,deter_exam_2)data_classify()

二、结果展示

生成文件夹示例:


Fruits-3下分类结果:


程序运行结果部分截图:


数据和代码连接:

https://pan.baidu.com/s/1eweFKIRDu3ZLKv00Tg_SEA

提取码:1414

opencv用特征相似度将图片分类相关推荐

  1. python图片相似度计算_python Opencv计算图像相似度过程解析

    这篇文章主要介绍了python Opencv计算图像相似度过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 一.相关概念 一般我们人区分谁是谁 ...

  2. R语言使用randomForest包构建随机森林模型(Random forests)、使用importance函数查看特征重要度、使用table函数计算混淆矩阵评估分类模型性能、包外错误估计OOB

    R语言使用randomForest包中的randomForest函数构建随机森林模型(Random forests).使用importance函数查看特征重要度.使用table函数计算混淆矩阵评估分类 ...

  3. 【深度学习】(5) 简单网络,案例:服装图片分类,附python完整代码

    1. 数据获取 使用系统内部的服装数据集构建神经网络.首先导入需要的库文件,x和y中保存训练集的图像和目标.x_test和y_test中保存测试集需要的图像和目标.(x, y)及(x_test, y_ ...

  4. lda进行图片分类_基于SIFT+Kmeans+LDA的图片分类器的实现

    题记:2012年4月1日回到家,南大计算机研究僧复试以后,等待着的就是独坐家中无聊的潇洒.不知哪日,无意中和未来的同学潘潘聊到了图像处理,聊到了她的论文<基于LDA的行人检测>,出于有一年 ...

  5. opencv自然背景下交通标志形状分类c++代码_前端革命时刻:前端代码是怎样智能生成的-图像分离篇

    作为阿里经济体前端委员会四大技术方向之一,前端智能化项目经历了 2019 双十一的阶段性考验,交出了不错的答卷,天猫淘宝双十一会场新增模块 79.34% 的线上代码由前端智能化项目自动生成.在此期间研 ...

  6. 利用lightgbm做learning to rank 排序,解析模型中特征重要度

    向AI转型的程序员都关注了这个号???????????? 机器学习AI算法工程   公众号:datayx 去年实习时,因为项目需要,接触了一下Learning to Rank(以下简称L2R),感觉很 ...

  7. 动手深度学习13——计算机视觉:数据增广、图片分类

    文章目录 一.数据增广 1.1 为何进行数据增广? 1.2 常见图片增广方式 1.2.1 翻转 1.2.2 切割(裁剪) 1.2.3 改变颜色 1.2.4 综合使用 1.3 使用图像增广进行训练 1. ...

  8. 快速实践大规模轻量级图片分类模型:飞桨识图 PP-ShiTu

    快速实践大规模图片分类模型:飞桨识图 PP-ShiTu 飞桨识图PP-ShiTu是轻量级图像识别系统,集成了目标检测.特征学习.图像检索等模块,广泛适用于各类图像识别任务.CPU上0.2s即可完成在1 ...

  9. 基于传统CV实现图片分类(以图搜图)

    图片分类在计算机领域并不是一个新鲜的话题了,相对于传统计算机视觉(CV)方法解决这类问题,深度学习的效果反而更好.但是我们依然需要了解传统做法,说不定在未来研究时可以提供不一样的灵感. 图像描述符 要 ...

最新文章

  1. dw做php怎么做表格透明,DW做的简单PHP管理
  2. VS中的C#项目怎样引入另一个项目
  3. Mysql 优化器内部JOIN算法hash join Nestloopjoin及classic hash join CHJ过程详解
  4. 《球球大作战》游戏优化之路(上)
  5. 单词搜索Python解法
  6. 页面缓存处理的几种方法
  7. wince中重启网卡
  8. python外星人入侵不显示子弹_【Python】python外星人入侵,武装飞船,代码写好后,不显示子弹...
  9. 汉字为什么能流传至今_女皇武则天自创18个汉字,有17个被废除了,只有这1个字流传至今...
  10. python判断不等_Python黑魔法笔记第六关:消灭该死的重复(下)
  11. 图像目标检测识别,计算物体个数,针对电子元器件计算
  12. matlab画图入门教程
  13. 收藏模板:软件日报告模板(参考)
  14. Linux中fork函数详解(附图解与代码实现)
  15. java字符串中的数据排序
  16. yuv420sp转jpg
  17. 使用Python进行网站页面开发——Django快速入门
  18. 字跳三轮面试完,我想去读个硕士了T_T
  19. java项目开发案例 报销_java19134企业员工出差报销预算管理系统-SSH-Mysql
  20. 小常识:保险中的“保全”是什么?

热门文章

  1. Dagger2简介(一)
  2. 炼丹师入门修炼指南-深度学习入门资料推荐
  3. linux命令行参数含空格,Linux的命令行参数风格
  4. 使用multiparty实现文件上传
  5. Nginx正向代理和反向代理详解及其配置
  6. 软件工程学习过程中工具、资料汇总与心得
  7. State パターン
  8. linux命令中zxvf分别表示含义
  9. 【Linux】查看已被占用端口号
  10. vue把字符串分割成等长的若干字符串,根据特定字符分割字符串