基于两幅图像间欧氏距离和直方图匹配的图像匹配python
# 创建GUI窗口打开图像 并显示在窗口中
import tkinter as tk # 导入GUI界面函数库
from tkinter import *
import tkinter.filedialog
from PIL import Image, ImageTk # 导入图像处理函数库
from os import listdir
import numpy as np
import cv2
path = r'C:/Users/song/Desktop/set/'#图像文件夹
# 创建窗口 设定大小并命名
window = tk.Tk()
window.title('图像匹配')
window.geometry('800x600')
var = tk.StringVar() # 这时文字变量储存器
lb = Label(window,text='')
def input_file_name():
global img_current
global file_name
file_name = str(inp1.get())
imagesList = listdir(path)
for image in imagesList:
if (image==file_name):
img = Image.open(path + image)
img_current = ImageTk.PhotoImage(img)
label_Img = tk.Label(window, image=img_current)
label_Img.place(relx=0.25,rely=0,relheight=0.3,relwidth=0.3)
def Euc():
Euc_dist_list=[]
image_list=[]
imagesList = listdir(path)
cnt=0
global Euc_image
dist=float('inf')
for image in imagesList:
if image!=file_name:
cnt = cnt+1
current_image=np.array(Image.open(path + file_name))
other_image=np.array(Image.open(path + image))
image_dist = np.linalg.norm(current_image-other_image)
Euc_dist_list.append(image_dist)
image_list.append(image)
#sim = 1/(1+dist)
if image_dist<dist:
dist = image_dist
Euc_image = image
img = Image.open(path + Euc_image)
Euc_image = ImageTk.PhotoImage(img)
similar_Img = tk.Label(window, image=Euc_image)
similar_Img.place(relx=0.25,rely=0.35,relheight=0.3,relwidth=0.3)
Euc_value = Scrollbar(window)
lb = Listbox(window,yscrollcommand=Euc_value.set) # 内容 控制滚动条 .
for i in range(cnt):
lb.insert(END,image_list[i]+' '+str(Euc_dist_list[i]))
lb.place(relx=0.65,rely=0.35,relheight=0.3,relwidth=0.3)
Euc_value.config(command=lb.yview)
def Hst():
Hst_dist_list=[]
image_list=[]
imagesList = listdir(path)
cnt=0
global Hist_image
Hist=float('inf')
for image in imagesList:
if image!=file_name:
cnt = cnt+1
current_image = cv2.imread(path+file_name)
other_image= cv2.imread(path+image)
H1_b= cv2.calcHist([current_image],[0],None,[256],[0,256])
# H1_b=cv2.normalize(H1_b,H1_b,0,1,cv2. NORM_MINMAX,-1)
H1_g= cv2.calcHist([current_image],[1],None,[256],[0,256])
# H1_g=cv2.normalize(H1_g,H1_g,0,1,cv2. NORM_MINMAX,-1)
H1_r= cv2.calcHist([current_image],[2],None,[256],[0,256])
# H1_r=cv2.normalize(H1_r,H1_r,0,1,cv2. NORM_MINMAX,-1)
H2_b= cv2.calcHist([other_image],[0],None,[256],[0,256])
# H2_b=cv2.normalize(H2_b,H2_b,0,1,cv2. NORM_MINMAX,-1)
H2_g= cv2.calcHist([other_image],[1],None,[256],[0,256])
# H2_g=cv2.normalize(H2_g,H2_g,0,1,cv2. NORM_MINMAX,-1)
H2_r= cv2.calcHist([other_image],[2],None,[256],[0,256])
# H2_r=cv2.normalize(H2_r,H2_r,0,1,cv2. NORM_MINMAX,-1)
image_Hist_b = cv2.compareHist(H1_b,H2_b,cv2.HISTCMP_CHISQR)
image_Hist_g = cv2.compareHist(H1_g,H2_g,cv2.HISTCMP_CHISQR )
image_Hist_r = cv2.compareHist(H1_r,H2_r,cv2.HISTCMP_CHISQR )
image_Hist = (image_Hist_b+image_Hist_g+image_Hist_r)/3
Hst_dist_list.append(image_Hist)
image_list.append(image)
if image_Hist<Hist:
Hist = image_Hist
Hist_image = image
img = Image.open(path + Hist_image)
Hist_image = ImageTk.PhotoImage(img)
similar_Img = tk.Label(window, image=Hist_image)
similar_Img.place(relx=0.25,rely=0.7,relheight=0.3,relwidth=0.3)
Hst_value = Scrollbar(window)
lb = Listbox(window,yscrollcommand=Hst_value.set) # 内容 控制滚动条 .
for i in range(cnt):
lb.insert(END,image_list[i]+' '+str(Hst_dist_list[i]))
lb.place(relx=0.65,rely=0.7,relheight=0.3,relwidth=0.3)
Hst_value.config(command=lb.yview)
inp1 = Entry(window)
inp1.place(relx=0, rely=0.15,relwidth=0.1)
btn1 = Button(window, text='搜索', command=input_file_name)
btn1.place(relx=0.1, rely=0.15,relwidth=0.1)
btn2 = Button(window, text='欧氏距离', command=Euc)
btn2.place(relx=0.1, rely=0.5,relwidth=0.1)
btn3 = Button(window, text='直方图相似度', command=Hst)
btn3.place(relx=0.1, rely=0.8,relwidth=0.1)
window.mainloop()
程序