Python 比较两张图片的相似百分比


1、比较图片和目录下的图片相似度;

#!C:/Python27
#coding=utf-8

import pytesseract
from pytesser import *
from PIL import Image,ImageEnhance,ImageFilter
import os
import fnmatch
import re,time

import urllib, random


#import hashlib  
 
def getGray(image_file):
   tmpls=[]
   for h in range(0,  image_file.size[1]):#h
      for w in range(0, image_file.size[0]):#w
         tmpls.append( image_file.getpixel((w,h))  )
          
   return tmpls
 
def getAvg(ls):#获取平均灰度值
   return sum(ls)/len(ls)
 
def getMH(a,b):#比较100个字符有几个字符相同
   dist = 0;
   for i in range(0,len(a)):
      if a[i]==b[i]:
         dist=dist+1
   return dist
 
def getImgHash(fne):
   image_file = Image.open(fne) # 打开
   image_file=image_file.resize((12, 12))#重置图片大小我12px X 12px
   image_file=image_file.convert("L")#转256灰度图
   Grayls=getGray(image_file)#灰度集合
   avg=getAvg(Grayls)#灰度平均值
   bitls=''#接收获取0或1
   #除去变宽1px遍历像素
   for h in range(1,  image_file.size[1]-1):#h
      for w in range(1, image_file.size[0]-1):#w
         if image_file.getpixel((w,h))>=avg:#像素的值比较平均值 大于记为1 小于记为0
            bitls=bitls+'1'
         else:
            bitls=bitls+'0'
   return bitls
'''         
   m2 = hashlib.md5()   
   m2.update(bitls)
   print m2.hexdigest(),bitls
   return m2.hexdigest()
'''
 
 
a=getImgHash(".//testpic//001n.bmp")#图片地址自行替换
files = os.listdir(".//testpic")#图片文件夹地址自行替换
for file in files:
   b=getImgHash(".//testpic//"+str(file))
   compare=getMH(a,b)
   print file,u'相似度',str(compare)+'%'    


2、图片放大等比较的几种方法集合


#!C:/Python27
#coding=utf-8

"""
    1、截屏,获取验证码图片;
    2、裁剪验证码为4个小图片;
    3、把4张图片放大为255*255像素图
    4、拿每块小图片去模型目录找相似的图片*4次;
    5、组装成字符串--->4位验证码
"""
import os ,sys 
import fnmatch
import re,time
import urllib, random
import pytesseract
from pytesser import *
from PIL import Image,ImageDraw

def GetVerficode(): #下载验证码图片
    
    for i in range(1,101):  

        url = 'https://cas.sf-express.com/cas/imgcode?a=0.7860542547321294'  

        print "download", i  

        file("./code/%04d.jpg" % random.randrange(10000), "wb").write(urllib.urlopen(url).read())
        
def GetImg():
    ImgPath = (".//code//9911.jpg")
    
def CutCrop():#分隔验证图片

    """global data 全局变量在整个函数中有效"""
    ImgPath = (".//code//")
    
    j = 1000  

    for f in os.listdir(ImgPath):
    
        if f.endswith(".jpg"):

            print f

            img = Image.open(ImgPath+f).convert('L')

            print img.size

            w, h = img.size

            #rowheight = h // rownum
            #colwidth = w // colnum
            #imgry.show()

            for i in range(4):                

                x = 10 + i*24  #验证码的x,y坐标

                y = 6  

                img.crop((x-4, y,x+6, y+14)).save("font/%d.bmp" % j)  

                print "j=",j  

                j += 1

def fixed_size():
    
    """按照固定尺寸放大处理4图片"""
    dirpath =(".//font//")
    j = 10000
    for imgfile in os.listdir(dirpath):
        print imgfile
        im = Image.open(dirpath+imgfile)
        #im.show()
        size = (256, 256)
        im2 =im.resize(size).convert('RGB')
        out = im2.resize(size,Image.ANTIALIAS)
        out.save(dirpath+'%d.bmp' % j)
        print u"\n按固定尺寸放大*4张图片,处理已完成"
        j += 1
                   
"""对比图片方法开始"""
def getGray(image_file):
   tmpls=[]
   for h in range(0,  image_file.size[1]):#h
      for w in range(0, image_file.size[0]):#w
         tmpls.append( image_file.getpixel((w,h))  )
          
   return tmpls
 
def getAvg(ls):#获取平均灰度值
   return sum(ls)/len(ls)
 
def getMH(a,b):#比较100个字符有几个字符相同
   dist = 0;
   for i in range(0,len(a)):
      if a[i]==b[i]:
         dist=dist+1
   return dist
 
def getImgHash(fne):
   image_file = Image.open(fne) # 打开
   image_file=image_file.resize((12, 12))#重置图片大小我12px X 12px
   image_file=image_file.convert("L")#转256灰度图
   Grayls=getGray(image_file)#灰度集合
   avg=getAvg(Grayls)#灰度平均值
   bitls=''#接收获取0或1
   #除去变宽1px遍历像素
   for h in range(1,  image_file.size[1]-1):#h
      for w in range(1, image_file.size[0]-1):#w
         if image_file.getpixel((w,h))>=avg:#像素的值比较平均值 大于记为1 小于记为0
            bitls=bitls+'1'
         else:
            bitls=bitls+'0'
   return bitls
'''         
   m2 = hashlib.md5()   
   m2.update(bitls)
   print m2.hexdigest(),bitls
   return m2.hexdigest()
'''
"""对比图片方法结束"""

def  FindImg():
    """
        遍历Pic 目录下的图片,去路径中找图片后缀为PNG的图片,对比
    """
    file_dir = (".\\BigImg") 
    L=[]
    for root,dirs,files in os.walk(file_dir):
        
        #print root,dirs,files #路径地址、文件夹名、文件名
        
        for file in files:
            L.append(os.path.join(root,file))
        #if imgfile.endswith(".bmp"):

    #print L ,len(L)       

    file_dir = (".\\result")      
    M=[]   
    for root, dirs, files in os.walk(file_dir):
        
        for file in files:
            
            if os.path.splitext(file)[1] == '.bmp':
                #print os.path.join(root, file)
                im2 = Image.open(os.path.join(root, file))
                #im2.show()
                M.append(os.path.join(root, file))
    #print M,len(M)                

    """外层循环4次,内层循环多次"""
    #i = len(L)
    for i in L :
        print "\n",i ,"\n"    
        a=getImgHash(i)

        for j in M:
            #im2 = Image.open(j)
            #print j
            b=getImgHash(j)
            compare=getMH(a,b)
            print j,u'相似度',str(compare)+'%'


"""下载图片"""
#GetVerficode()
"""裁剪图片"""
#CutCrop()
"""放大图片"""
#fixed_size()
"""对比图片"""
FindImg()


  • 9
    点赞
  • 38
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Python可以使用Image模块和OpenCV库来比较两张图片相似度。以下是一种常见的方法: 首先,使用Image模块将两张图片加载为Image对象: from PIL import Image image1 = Image.open("image1.jpg") image2 = Image.open("image2.jpg") 接下来,将图片转换为灰度图像,这样可以减少比较的复杂度: image1_gray = image1.convert("L") image2_gray = image2.convert("L") 然后,可以使用numpy库将图像转换为数组,并进行进一步的处理。使用OpenCV库计算图像的差异度量,例如均方差或结构相似性指数(SSIM): import cv2 import numpy as np array1 = np.array(image1_gray) array2 = np.array(image2_gray) # 计算均方差 mse = np.mean((array1 - array2) ** 2) # 计算结构相似性指数 ssim = cv2.SSIM(array1, array2) 最后,根据不同的应用需求,可以仅根据均方差或者结构相似性指数来判断图片相似度。均方差越小,说明图片相似;而结构相似性指数越接近1,说明图片相似。 这只是其中一种比较图片相似度的方法,Python还有其他库和方法可以实现类似功能。 ### 回答2: Python可以使用一些图像处理和计算机视觉库来比较两张图片相似度,下面我将介绍其中的几个库。 1. PIL库:Python Imaging Library(PIL)是一个用于图像处理的库,可以加载、处理和保存多种格式的图像。可以使用PIL库来计算两张图片的直方图,并通过比较直方图来判断相似度。 2. OpenCV库:OpenCV是一个开源计算机视觉库,提供了很多用于图像处理的函数和算法。可以使用OpenCV库来计算两张图片之间的结构相似性指数(SSIM),该指数可以评估两张图片在亮度、对比度和结构等方面的相似程度。 3. scikit-image库:scikit-image是一个用于图像处理的Python库,提供了很多图像处理和计算机视觉的功能。可以使用scikit-image库来计算两张图片之间的结构相似性指数(SSIM)和均方误差(MSE),从而评估图片相似度。 4. perceptual哈希算法:perceptual哈希算法是一种可以计算图片相似度的算法,它通过计算两张图片的哈希值并比较它们的相似程度来判断图片相似度Python中有一些开源的算法库可以使用,如DHash、AHash和PHash。 总之,Python提供了多种图像处理和计算机视觉库可以用来比较两张图片相似度。具体选择哪个库要根据实际需求和数据特点来决定,可以根据图片的特点、计算速度和准确度等因素来选择合适的方法。 ### 回答3: 在Python中,我们可以使用OpenCV库来比较两张图片相似度。OpenCV是一个开源的计算机视觉库,提供了一系列用于图像处理和计算机视觉任务的函数。下面是一个简单的例子来演示如何使用OpenCV比较两张图片相似度: ```python import cv2 # 读取两张图片 image1 = cv2.imread('image1.jpg') image2 = cv2.imread('image2.jpg') # 确保两张图片有相同的尺寸 image1 = cv2.resize(image1, (200, 200)) image2 = cv2.resize(image2, (200, 200)) # 将图片转换为灰度图像 gray1 = cv2.cvtColor(image1, cv2.COLOR_BGR2GRAY) gray2 = cv2.cvtColor(image2, cv2.COLOR_BGR2GRAY) # 计算两张图片的结构相似度指数(Structural Similarity Index,SSIM) ssim = cv2.compareSSIM(gray1, gray2) # 打印相似度 print("The SSIM between image1 and image2 is", ssim) ``` 上述代码中,我们首先使用`cv2.imread`函数读取两张图片,并使用`cv2.resize`函数将它们的尺寸调整为相同大小。然后,我们使用`cv2.cvtColor`函数将其转换为灰度图像,因为相似度比较通常使用灰度图像而非彩色图像。 最后,我们使用`cv2.compareSSIM`函数计算了两张图片的结构相似度指数(SSIM)。SSIM是一种用于比较两张图像相似度的指标,其值在0到1之间,值越接近1表示两张图片相似。 需要注意的是,为了得到准确的相似度值,我们需要确保两张图片在尺寸上相同,以及选择合适的图像比较算法。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值