1. 程式人生 > >Python 比較兩張圖片的相似百分比

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()