自己做的本地识图软件DAMO_嗅图狗


毕设做了2周,实现了基本的本地识图功能,就两个文件,接下来复杂的功能就得多家几个文件了就变得麻烦,先发出来damo吧。

可以实现精确识图功能(缩略图那样的)

(界面没优化,将就着看看吧……当作毕设弄完我就发安装包)

环境:python3.6.3

包:pil、tkinter



Frontpage.py(启动文件)

from tkinter import *
from PIL import  ImageTk 
from PIL import Image
import os

#函数声明
#列出windows目录下的所有文件和文件名

#图片-dHash算法
import _dhash
def startSearch():
    im1=Image.open( var1.get())
    #遍历文件夹并传到列表
    Const_Image_Format = [".jpg",".jpeg",".bmp",".png"]
    path= var2.get()
    list1=[]
    for (root, dirs, files) in os.walk(path):  
        for filename in files:
            if os.path.splitext(filename)[1] in Const_Image_Format :
                #print(os.path.join(root,filename))
                list1.append(os.path.join(root,filename))
    #遍历比较
    list2=[]
    for i in list1:
        im2=Image.open(i)
        j=_dhash.classfiy_dHash(im1,im2,size=(9,8))
        if j<=int(var3.get()):
            print(j)
            print(i)
            list2.append(str(100-3*j)+'%')
            list2.append(i)
    #在listbox显示
    lb.delete(0, END) 
    for item in list2:
        lb.insert(END, item)    
    canvas.delete('all')
    #====================================
    load = Image.open(var1.get()) 
    render= ImageTk.PhotoImage(load)  
    #render.resize((200,200)) 
    img = Label(canvas,image=render)  
    img.image = render  
    img.place(x=0,y=0) 




#窗口开始===========================================================================
root = Tk()     # 初始旷的声明
root.title('嗅图狗')#设置窗口标题
root.geometry('800x500+500+200')#设置窗口的大小宽x高+偏移量
root.resizable(width=False, height=True) #宽不可变, 高可变,默认为True

#标题
Label(root, text='嗅图狗',  bg="yellow",font=('Arial', 20)).pack(side=TOP)
frm = Frame(root)
frm.pack(fill=BOTH)

#left左边显示给定图片
frm_L = Frame(frm,bg='gray')
frm_L.pack(side=LEFT)

frm_LT = Frame(frm_L,bg='blue')
frm_LT.pack(side=TOP)

Label(frm_LT, text='要找的图片的路径', font=(15)).pack(side=TOP)
var1 = StringVar()
e1 = Entry(frm_LT,width=30,textvariable = var1)
var1.set("请在此处输入需要查询的图片的路径")
e1.pack()

Label(frm_LT, text='图片文件夹路径', font=(15)).pack(side=TOP)
var2 = StringVar()
e2 = Entry(frm_LT,width=30,textvariable = var2)
var2.set("请在此处输入需要搜索的文件夹路径")
e2.pack()

var3 = StringVar()
e3 = Entry(frm_LT,width=3,textvariable=var3)
var3.set("10")
e3.pack(side=RIGHT)

def print_select(v):
    e3.config(var3.set(str(v)))
s=Scale(frm_LT,label="误差百分比", from_=0,to=100,orient=HORIZONTAL,
        length=100,showvalue=0,tickinterval=25,resolution=10,command=print_select)
s.pack(side=RIGHT)


b1 = Button(frm_LT,text="开始搜图",bg='green',width=10,height=1,
            command=startSearch)
b1.pack(side=LEFT)




#right右边显示路径
frm_R = Frame(frm,bg='gray')
frm_R.pack()

Label(frm_R, text='所找图片预览', font=(15)).pack()
canvas=Canvas(frm_R,width=400, height=400,bg='red')
image_file=PhotoImage(file='pic.png')
canvas.create_image(200,200,image=image_file)
canvas.pack(side=BOTTOM)



def print_item(event):
    print (lb.get(lb.curselection()))
    #读取图像  
    im=Image.open(lb.get(lb.curselection()))  
    #显示图像  
    im.show()  


Label(frm_L, text='找到的图片路径', font=(15)).pack()
lb = Listbox(frm_L, width=60)
lb.bind('<ButtonRelease-1>', print_item)
lb.pack(side=BOTTOM)


print(var1.get())
print(var2.get())

root.mainloop()#进入消息循环



以下算法博客来源:https://segmentfault.com/a/1190000004467183      

来源GIT:https://github.com/MashiMaroLjc/Learn-to-identify-similar-images

_dhash.py(被上边的import,第10行)

from PIL import Image
from PIL import ImageFilter
from PIL import ImageOps
#This module can classfy the image by dHash
#
#author MashiMaroLjc
#version 2016-2-16

def getCode(img,size):

	result = []
	# print("x==",size[0])
	# print("y==",size[1]-1)
	
	x_size = size[0]-1#width
	y_size = size[1] #high
	for x in range(0,x_size):
		for y in range(0,y_size):
			now_value = img.getpixel((x,y))
			next_value = img.getpixel((x+1,y))

			if next_value < now_value:
				result.append(1)
			else:
				result.append(0)


	return result



def compCode(code1,code2):
	num = 0
	for index in range(0,len(code1)):
		if code1[index] != code2[index]:
			num+=1
	return num 

def classfiy_dHash(image1,image2,size=(9,8)):
	''' 'image1' and 'image2' is a Image Object.
	You can build it by 'Image.open(path)'.
	'Size' is parameter what the image will resize to it and then image will be compared to another image by the dHash.
	It's 9 * 8 when it default.  
	The function will return the hamming code,less is correct. 
	'''
	image1 = image1.resize(size).convert('L')
	code1 = getCode(image1, size)


	image2 = image2.resize(size).convert('L')
	code2 = getCode(image2, size)

	assert len(code1) == len(code2),"error"
	
	return compCode(code1, code2)



__all__=[classfiy_dHash]



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章