标签分类 技术文章:
当前位置:首页 > Python技术文章 > 使用python opencv对目录下图片进行去重的方法

python opencv对目录下图片进行去重的技巧

  • 发布时间:
  • 作者:码农之家原创
  • 点击:75

这篇文章主要知识点是关于python、opencv、图片、去重、的内容,如果大家想对相关知识点有系统深入的学习,可以参阅以下电子书

疯狂Python讲义
疯狂Python讲义含源码工具版
  • 类型:Python编程大小:124.3 MB格式:PDF出版:电子工业出版社作者:李刚
立即下载
Python学习手册
Python学习手册第4、5完整版
  • 类型:Python手册大小:123 MB格式:PDF出版:机械工业出版社作者:马克·卢茨
立即下载

更多Python相关的学习资源可以参阅 Python电子书程序设计电子书 等栏目。

使用python opencv对目录下图片进行去重的方法

版本:

平台:ubuntu 14 / I5 / 4G内存

python版本:python2.7

opencv版本:2.13.4

依赖:

如果系统没有python,则需要进行安装

sudo apt-get install python

sudo apt-get install python-dev

sudo apt-get install python-pip

sudo pip install numpy mathplotlib

sudo apt-get install libcv-dev

sudo apt-get install python-opencv

使用感知哈希算法进行图片去重

原理:对每个文件进行遍历所有进行去重,因此图片越多速度越慢,但是可以节省手动操作

感知哈希原理:

1、需要比较的图片都缩放成8*8大小的灰度图

2、获得每个图片每个像素与平均值的比较,得到指纹

3、根据指纹计算汉明距离

5、如果得出的不同的元素小于5则为相同(相似?)的图片

#!/usr/bin/python
# -*- coding: UTF-8 -*-
 
import cv2
import numpy as np
import os,sys,types
 
def cmpandremove2(path):
 dirs = os.listdir(path)
 dirs.sort()
 if len(dirs) <= 0:
  return
 dict={}
 for i in dirs:
  prepath = path + "/" + i
  preimg = cv2.imread(prepath)
  if type(preimg) is types.NoneType:
   continue
  preresize = cv2.resize(preimg, (8,8))
  pregray = cv2.cvtColor(preresize, cv2.COLOR_BGR2GRAY)
  premean = cv2.mean(pregray)[0]
  prearr = np.array(pregray.data)
  for j in range(0,len(prearr)):
   if prearr[j] >= premean:
    prearr[j] = 1
   else:
    prearr[j] = 0
  print "get", prepath
  dict[i] = prearr
 dictkeys = dict.keys()
 dictkeys.sort()
 index = 0
 while True:
  if index >= len(dictkeys):
   break
  curkey = dictkeys[index]
  dellist=[]
  print curkey
  index2 = index
  while True:
   if index2 >= len(dictkeys):
    break
   j = dictkeys[index2]
   if curkey == j:
    index2 = index2 + 1
    continue
   arr1 = dict[curkey]
   arr2 = dict[j]
   diff = 0
   for k in range(0,len(arr2)):
    if arr1[k] != arr2[k]:
     diff = diff + 1
   if diff <= 5:
    dellist.append(j)
   index2 = index2 + 1
  if len(dellist) > 0:
   for j in dellist:
    file = path + "/" + j
    print "remove", file
    os.remove(file)
    dict.pop(j)
   dictkeys = dict.keys()
   dictkeys.sort()
  index = index + 1
def cmpandremove(path):
 index = 0
 flag = 0
 dirs = os.listdir(path)
 dirs.sort()
 if len(dirs) <= 0:
  return 0
 while True:
  if index >= len(dirs):
   break
  prepath = path + dirs[index]
  print prepath
  index2 = 0
  preimg = cv2.imread(prepath)
  if type(preimg) is types.NoneType:
   index = index + 1
   continue
  preresize = cv2.resize(preimg,(8,8))
  pregray = cv2.cvtColor(preresize, cv2.COLOR_BGR2GRAY)
  premean = cv2.mean(pregray)[0]
  prearr = np.array(pregray.data)
  for i in range(0,len(prearr)):
   if prearr[i] >= premean:
    prearr[i] = 1
   else:
    prearr[i] = 0
  removepath = []
  while True:
   if index2 >= len(dirs):
    break
   if index2 != index:
    curpath = path + dirs[index2]
    #print curpath
    curimg = cv2.imread(curpath)
    if type(curimg) is types.NoneType:
     index2 = index2 + 1
     continue
    curresize = cv2.resize(curimg, (8,8))
    curgray = cv2.cvtColor(curresize, cv2.COLOR_BGR2GRAY)
    curmean = cv2.mean(curgray)[0]
    curarr = np.array(curgray.data)
    for i in range(0,len(curarr)):
     if curarr[i] >= curmean:
      curarr[i] = 1
     else:
      curarr[i] = 0
    diff = 0
    for i in range(0,len(curarr)):
     if curarr[i] != prearr[i] :
      diff = diff + 1
    if diff <= 5:
     print 'the same'
     removepath.append(curpath)
     flag = 1
   index2 = index2 + 1
  index = index + 1
  if len(removepath) > 0:
   for file in removepath:
    print "remove", file
    os.remove(file)
   dirs = os.listdir(path)
   dirs.sort()
   if len(dirs) <= 0:
    return 0
   #index = 0
 return flag
  
def main(argv):
 if len(argv) <= 1:
  print "command error"
  return -1
 if os.path.exists(argv[1]) is False:
  return -1
 path = argv[1]
 '''
 while True:
  if cmpandremove(path) == 0:
   break
 '''
 cmpandremove(path)
 return 0
   
if __name__ == '__main__':
 main(sys.argv)

为了节省操作,遍历所有目录,把想要去重的目录遍历一遍

#!/bin/bash
indir=$1
addcount=0
function intest()
{
 
 for file in $1/*
 do
  echo $file
  if test -d $file 
  then
   ~/similar.py $file/
   intest $file
  fi
 done
}

intest $indir

以上这篇使用python opencv对目录下图片进行去重的方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持码农之家。

以上就是本次给大家分享的关于Python的全部知识点内容总结,大家还可以在下方相关文章里找到python ddt数据驱动实例代码、 python测试opencv时imread导致、 如何由java转学python、 等python文章进一步学习,感谢大家的阅读和支持。

上一篇:Flask框架ajax跨域请求实现遇到的坑

下一篇:pandas数据归一化以和行删除例程的具体办法介绍

展开 +

收起 -

学习笔记
网友NO.413659

Python基于opencv实现的简单画板功能示例

本文实例讲述了Python基于opencv实现的简单画板功能。分享给大家供大家参考,具体如下: import cv2import numpy as npdrawing = False # true if mouse is pressedix,iy = -1,-1def nothing(x): pass# mouse callback functiondef draw_circle(event,x,y,flags,param): global ix,iy,drawing g = param[0] b = param[1] r = param[2] shape = param[3] if event == cv2.EVENT_LBUTTONDOWN: drawing = True ix,iy = x,y elif event == cv2.EVENT_MOUSEMOVE: if drawing == True: if shape == 0: cv2.rectangle(img,(ix,iy),(x,y),(g,b,r),-1) else: cv2.circle(img,(x,y),5,(g,b,r),-1) elif event == cv2.EVENT_LBUTTONUP: drawing = False if shape == 0: cv2.rectangle(img,(ix,iy),(x,y),(g,b,r),-1) else: cv2.circle(img,(x,y),5,(g,b,r),-1)# Create a black image, a windowimg = np.zeros((300,512,3), np.uint8)cv2.namedWindow('image')# create trackbars for color changecv2.createTrackbar('R','image',0,255,nothing)cv2.createTrackbar('G','image',0,255,nothing)cv2.createTrackbar('B','image',0,255,nothing)# create switch for ON/OFF functionalityswitch1 = '0 : OFF \n1 : ON'switch2 = '0: Rectangle \n1: Line 'cv2.createTrackbar(switch1, 'image',0,1,nothing)cv2.createTrackbar(switch2, 'image',0,1,nothing)while(1): cv2.imshow('image',img) k = cv2.waitKey(1) & 0xFF # get current positions of four trackbars if k == 27: break r = cv2.getTrackbarPos('R','image') g = cv2.getTrackbarPos('G','image') b = cv2.getTrackbarPos('B','image') shape = cv2.getTrackbarPos(switch2,'image') s = cv2.getTrackbarPos(switch1,'imag……

网友NO.707022

使用python写的opencv实时监测和解析二维码和条形码

今天,我实现了一个很有趣的demo,它可以在视频里找到并解析二维码,然后把解析的内容实时在屏幕上显示出来。 然后我们直入主题,首先你得确保你装了 opencv,python,zbar 等环境。然后这个教程对于学过opencv的人可能更好理解,但是没学过也无妨,到时候也可以直接用。 比如我的电脑上的环境是opencv2.4.x,python2.7,和最新的zbar,在Ubuntu 12.12的系统下运行的 假设你的opencv已经安装好了,那么我们就可以安装zbar 你可以先更新一下 sudo apt-get update 然后在输入 sudo apt-get install python-zbar 如果环境装好了,我们就可以接着下一步操作了。 首先让我们来实现找到在图片里面找到二维码的功能 先新建一个python文件叫做; simple_barcode_detection.py 代码如下,这定义了一个函数,实现从一副图片里面找出二维码的位置 我们要检测的二维码的图片 import numpy as np import cv2 def detect(image):# 把图像从RGB装换成灰度图gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)# 使用Scharr操作(指定使用ksize = -1)构造灰度图在水平和竖直方向上的梯度幅值表示。gradX = cv2.Sobel(gray, ddepth = cv2.cv.CV_32F, dx = 1, dy = 0, ksize = -1)gradY = cv2.Sobel(gray, ddepth = cv2.cv.CV_32F, dx = 0, dy = 1, ksize = -1)#Scharr操作后,从x的梯度减去y的梯度gradient = cv2.subtract(gradX, gradY)gradient = cv2.convertScaleAbs(gradient)#经过上面的操作……

网友NO.196597

Python+OpenCV实现图像融合的原理及代码

根据导师作业安排,在学习数字图像处理(刚萨雷斯版)第六章 彩色图像处理 中的彩色模型后,导师安排了一个比较有趣的作业: 融合原理为: 1 注意:遥感原RGB图image和灰度图Grayimage为测试用的输入图像; 2 步骤:(1)将RGB转换为HSV空间(H:色调,S:饱和度,V:明度); (2)用Gray图像诶换掉HSV中的V; (3)替换后的HSV转换回RGB空间即可得到结果。 书上只介绍了HSI彩色模型,并没有说到HSV,所以需要网上查找资料。 Python代码如下: import cv2import numpy as npimport mathfrom matplotlib import pyplot as pltdef caijian(img):#裁剪图像与否根据选择图像大小而定,调用了OpenCV函数weight=img.shape[0]height=img.shape[1]print(“图像大小为:%d*%d”%(weight,height))img=cv2.resize(img,(int(weight/2),int(height/2)),interpolation=cv2.INTER_CUBIC)return(img)def graytograyimg(img):grayimg=img1weight=img.shape[0]height=img.shape[1]for i in range(weight):for j in range(height):grayimg[i,j]=0.299img[i,j,0]+0.587img[i,j,1]+0.114img[i,j,2]return(grayimg)def RGBtoHSV(img):b,g,r=cv2.split(img)rows,cols=b.shapeH=np.ones([rows,cols],“float”)S=np.ones([rows,cols],“float”)V=np.ones([rows,cols],“float”)print(“RGB图像大小:%d*%d”%(rows,cols))for i in range(0, rows):for j in range(0, cols):MAX=max((b[i,j],g[i,j],r[i,j]))MIN=min((b[i,j],g[i,j],r[i,j]))V[i,j]=MAXif V[i,j]0:S[i,j]=0else:S[i,j]=(V[i,j]-MIN)/V[i,j]i……

网友NO.792880

python OpenCV学习笔记实现二维直方图

本文介绍了python OpenCV学习笔记实现二维直方图,分享给大家,具体如下: 官方文档 – https://docs.opencv.org/3.4.0/dd/d0d/tutorial_py_2d_histogram.html 在前一篇文章中,我们计算并绘制了一维的直方图。它被称为一维,因为我们只考虑一个特性,即像素的灰度强度值。但是在二维直方图中,你可以考虑两个特征。通常它用于寻找颜色直方图,其中两个特征是每个像素的色调和饱和度值。 有一个python样例(samples/python/color_histogram.py),用于查找颜色直方图。我们将尝试理解如何创建这样的彩色直方图,它将有助于理解像直方图反向投影这样的更深入的主题。 OpenCV中的二维直方图 它非常简单,并且使用相同的函数cv.calcHist()来计算。对于颜色直方图,我们需要将图像从BGR转换为HSV。(记住,对于一维的直方图,我们从BGR转换为灰度)。对于2D直方图,它的参数将被修改如下: channels = [0,1]:因为我们需要同时处理H(色调Hue)和S(饱和度Saturation)。 bins = [180,256]:180对应H,256对应S。 range = [0,180,0,256]:色调值介于0到180之间,饱和度介于0到256之间。 import numpy as npimport cv2 as cvimg = cv.imread('home.jpg')hsv = cv.cvtColor(img, cv.COLOR_BGR2HSV)hist = cv.calcHist([hsv], [0,1], None, [180,256], [0,180,0,256]) Numpy中的二维直方图 Numpy同样提供特有的函数,np.histogram2d()(记住,对于……

<
1
>

Copyright 2018-2019 xz577.com 码农之家

版权责任说明