圖像匹配 歐氏距離 直方圖匹配 python

基於兩幅圖像間歐氏距離和直方圖匹配的圖像匹配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()

程序 

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