毕设做了2周,实现了基本的本地识图功能,就两个文件,接下来复杂的功能就得多家几个文件了就变得麻烦,先发出来damo吧。
可以实现精确识图功能(缩略图那样的)
(界面没优化,将就着看看吧……当作毕设弄完我就发安装包)
环境:python3.6.3
包:pil、tkinter
DAOM源码(3个.py文件,分别粘贴设置启动文件即可运行界面及功能)
rontpage.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]
2018.10.2================分割线==========
这篇写的东西,分别保存3个.py文件就能运行了。
成品度盘链接【嗅图狗.exe】(有的会有“找不到FP”的运行错误,我不知道pythoninstaller抽什么疯病……)
https://pan.baidu.com/s/1BSFGMbyQk1Fqgo4zL5WX4A
可用成品链接在↓
我新开了一篇博客,把做的过程,git都放了出来(上面说有问题的以后更新在这里 ):
https://blog.csdn.net/sinat_27382047/article/details/83040411