Python证件照背景自定义改色,带Tkinter界面,代码全文解释!
直接點先上效果。
創作不易,轉載請注明出處 ,代碼解釋在后面。
源碼:
import tkinter import numpy as np import tkinter.messagebox import os import cv2def center_window(root, width, height):screenwidth = root.winfo_screenwidth()screenheight = root.winfo_screenheight()size = '%dx%d+%d+%d' % (width, height, (screenwidth - width) / 2, (screenheight - height) / 2)root.geometry(size)window = tkinter.Tk() window.title('證件照改色') center_window(window, 500, 500)def bet_read():if EImg.get() == '':tkinter.messagebox.showerror('錯誤', '請輸入文件路徑')else:if os.path.exists(EImg.get()):original = cv2.imread(EImg.get())cv2.imshow("original", original)tkinter.messagebox.showinfo(title='提示', message='查看成功')else:tkinter.messagebox.showerror('錯誤', '請輸入正確文件路徑')def bet_revamp():if EImg.get() == '':tkinter.messagebox.showerror('錯誤', '請輸入文件路徑')else:state_color = int(var.get())if state_color == 0:tkinter.messagebox.showerror('錯誤', '請選擇背景顏色')else:if os.path.exists(EImg.get()):if Eb.get() == '' or Eg.get() == '' or Er.get() == '' \or int(Eb.get()) > 255 or int(Eg.get()) > 255 or int(Eb.get()) > 255 \or int(Eb.get()) < 0 or int(Eg.get()) < 0 or int(Eb.get()) < 0:tkinter.messagebox.showerror('錯誤', '請輸入正確圖片BGR值')else:img = cv2.imread(EImg.get())rows, cols, channels = img.shapecv2.imshow('img', img)hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)# cv2.imshow('hsv',hsv)if state_color == 1:lower_red = np.array([0, 135, 135])upper_red = np.array([180, 245, 230])mask = cv2.inRange(hsv, lower_red, upper_red)if state_color == 2:lower_blue = np.array([90, 70, 70])upper_blue = np.array([110, 255, 255])mask = cv2.inRange(hsv, lower_blue, upper_blue)if state_color == 3:lower_white = np.array([230, 230, 230])upper_white = np.array([256, 256, 256])mask = cv2.inRange(img, lower_white, upper_white)erode = cv2.erode(mask, None, iterations=1)# cv2.imshow('erode',erode)for i in range(rows):for j in range(cols):if erode[i, j] == 255:img[i, j] = (Eb.get(), Eg.get(), Er.get())cv2.imshow('res', img)tkinter.messagebox.showinfo(title='提示', message='修改成功')else:tkinter.messagebox.showerror('錯誤', '請輸入正確文件路徑')labImg = tkinter.Label(window, text='輸入圖片路徑,目前支持標準證件照背景', bg='white', font=('Arial', 12), width=30, height=2) labImg.pack() EImg = tkinter.Entry(window, width=40) EImg.pack()bet_read = tkinter.Button(window, text='查看圖片', bg='pink', width=15, height=2, command=bet_read) bet_read.pack()lab3 = tkinter.Label(window, text='請輸入BGR值 為0-255', bg='red', font=('Arial', 12), width=20, height=2) lab3.pack()lab = tkinter.Label(window, text='輸入背景要修改的 B 值', bg='green', font=('Arial', 12), width=20, height=2) lab.pack()Eb = tkinter.Entry(window, width=10) Eb.pack()lab1 = tkinter.Label(window, text='輸入背景要修改的 G 值', bg='green', font=('Arial', 12), width=20, height=2) lab1.pack()Eg = tkinter.Entry(window, width=10) Eg.pack()lab2 = tkinter.Label(window, text='輸入背景要修改的 R 值', bg='green', font=('Arial', 12), width=20, height=2) lab2.pack() Er = tkinter.Entry(window, width=10) Er.pack()bet_revamp = tkinter.Button(window, text='修改圖片', bg='pink', width=15, height=2, command=bet_revamp) bet_revamp.pack()var = tkinter.StringVar() var.set(0) r1 = tkinter.Radiobutton(window, text='背景色紅', variable=var, value='1') r1.pack() r2 = tkinter.Radiobutton(window, text='背景色藍', variable=var, value='2') r2.pack() r3 = tkinter.Radiobutton(window, text='背景色白', variable=var, value='3') r3.pack() tkinter.messagebox.showinfo(title='創作不易,轉載注明出處', message='歡迎訪問我的CSDN主頁@Youzhe_Jiang')window.mainloop()基于Python的證件照實現
第一章 功能介紹
1.1使用選中的證件照進行自定義的背景色轉換,目前只支持標準證件照背景色
第二章 代碼解釋
2.1 主界面代碼解釋
引入顯示窗口的庫文件tkinter。
import tkinter定義一個函數def center_window
def center_window(root, width, height):# 獲取顯示屏高度和寬度
screenwidth = root.winfo_screenwidth()screenheight = root.winfo_screenheight()# 設置窗口居中參數
# 讓窗口居中顯示
size = '%dx%d+%d+%d' % (width, height, (screenwidth - width) / 2, (screenheight - height) / 2)root.geometry(size)# 創建主窗口
# 設置窗口顯示的名稱
# 設置窗口大小
window = tkinter.Tk() window.title('證件照改色') center_window(window, 500, 500)# 顯示主窗口
window.mainloop()# 顯示效果如圖
2.2 主界面控件代碼解釋
例1 ?Label標簽
windows 為標簽所屬的主界面,text 為標簽所顯示文字,bg 為標簽背景色,font 為文字字體,width為寬,height為高 ,lab.pack()將定義的Label擺放到容器上。
lab = tkinter.Label(window, text='輸入背景要修改的 B 值', bg='green', font=('Arial', 12), width=20, height=2) lab.pack()例2 ?Entry 輸入框
windows 為標簽所屬的主界面,width為寬,默認height高的值為 1,Er.pack()將定義的Entry 擺放到容器上。
Er = tkinter.Entry(window, width=10) Er.pack()例3 ?Button 按鈕
windows 為按鈕所屬的主界面,text 為按鈕所顯示文字,bg 為標簽背景色,width為寬,height為高 ,command 為當按鈕點擊綁定的事件,bet_revamp.pack()將定義的Button 擺放到容器上。
bet_read = tkinter.Button(window, text='查看圖片', bg='pink', width=15, height=2, command=bet_read) bet_read.pack()例4 Radiobutton單選按鈕
windows 為按鈕所屬的主界面,text 為按鈕所顯示文字,variable 為按鈕的綁定組,在此綁定組中只能有一個值,value為按鈕的唯一值,var.set(0)為默認選擇的值為0,r1.pack()將按鈕擺放到容器上。
var = tkinter.StringVar() var.set(0) r1 = tkinter.Radiobutton(window, text='背景色紅', variable=var, value='1') r1.pack() r2 = tkinter.Radiobutton(window, text='背景色藍', variable=var, value='2') r2.pack() r3 = tkinter.Radiobutton(window, text='背景色白', variable=var, value='3') r3.pack()# 顯示效果如圖
2.3 按鈕點擊事件的實現
查看圖片
第一步,引入提示消息框的庫文件tkinter.messagebox,用作路徑判斷的庫文件os,用作計算機視覺的庫文件cv2。
import tkinter.messagebox import os import cv2第二步,新建一個函數,和之前的Button 按鈕綁定好點擊事件bet_read。
第三步,獲取輸入名為EImg的Entry 輸入框內容,判斷是否為空,如為空則使用tkinter庫中的messagebox的showerror方法彈出錯誤提示。如不為空則進入第二個判斷,調用os.path.exists方法判斷文件是否存在,如果存在則其值為true,運行cv2的imread方法讀取圖片,使用imshow方法將其顯示,并提示查看成功。不存在則為false,提示文件路徑錯誤。
def bet_read():if EImg.get() == '':tkinter.messagebox.showerror('錯誤', '請輸入文件路徑')else:if os.path.exists(EImg.get()):original = cv2.imread(EImg.get())cv2.imshow("original", original)tkinter.messagebox.showinfo(title='提示', message='查看成功')else:tkinter.messagebox.showerror('錯誤', '請輸入正確文件路徑')修改圖片
第一步,新建一個函數,和之前的Button 按鈕綁定好點擊事件bet_revamp。
第二步,獲取輸入名為EImg的Entry 輸入框內容,判斷是否為空,如為空則彈出錯誤提示。如不為空則進入第二個判斷,獲取單選按鈕var控件的值,判斷你是否選擇了背景顏色,如果不為0則進入第三個判斷,調用os.path.exists方法判斷文件是否存在,如果存在則其值為true進行第四個判斷,判斷輸入的BGR值是否為空且值是否在0-255的范圍區間,如輸入正確進入修改背景程序
def bet_revamp():if EImg.get() == '':tkinter.messagebox.showerror('錯誤', '請輸入文件路徑')else:state_color = int(var.get())if state_color == 0:tkinter.messagebox.showerror('錯誤', '請選擇背景顏色')else:if os.path.exists(EImg.get()):if Eb.get() == '' or Eg.get() == '' or Er.get() == '' \or int(Eb.get()) > 255 or int(Eg.get()) > 255 or int(Eb.get()) > 255 \or int(Eb.get()) < 0 or int(Eg.get()) < 0 or int(Eb.get()) < 0:tkinter.messagebox.showerror('錯誤', '請輸入正確圖片BGR值')else:第二步,根據你輸入的圖片路徑進行圖片的獲取,把其值賦給img。通過img.shape讀取img的參數,rows為行,cols為列,channels為通道數,使用cv2.imshow方法把原圖展現。把獲取到的圖片通過cv2.COLOR_BGR2HSV轉換為HSV格式圖片(色調(H)、飽和度(S)和透明度(V))以便于進行圖片灰度處理。
img = cv2.imread(EImg.get())rows, cols, channels = img.shapecv2.imshow('img', img)hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)# cv2.imshow('hsv',hsv)第三步,根據你的背景顏色進行一個二值化參數的設置,lower是范圍下限,upper是范圍上限,在范圍內的顏色會被修改成為白色,不在范圍內的顏色會被修改成黑色,將二值化后的圖片進行膨脹以去除毛刺和意外的亮點。iterations為腐蝕膨脹的次數。
if state_color == 1:lower_red = np.array([0, 135, 135])upper_red = np.array([180, 245, 230])mask = cv2.inRange(hsv, lower_red, upper_red)if state_color == 2:lower_blue = np.array([90, 70, 70])upper_blue = np.array([110, 255, 255])mask = cv2.inRange(hsv, lower_blue, upper_blue)if state_color == 3:lower_white = np.array([230, 230, 230])upper_white = np.array([256, 256, 256])mask = cv2.inRange(img, lower_white, upper_white)erode = cv2.erode(mask, None, iterations=1)# cv2.imshow('erode',erode)第四步替換,循環圖片的行和列遍歷每個像素點,把腐蝕膨脹后的圖片白色的值替換成所輸入的BGR,黑色的進行跳過,輸出圖片為res。同時彈出提示修改成功。
for i in range(rows):for j in range(cols):if erode[i, j] == 255:img[i, j] = (Eb.get(), Eg.get(), Er.get())cv2.imshow('res', img)tkinter.messagebox.showinfo(title='提示', message='修改成功')有問題歡迎私信,學識有限,目前在摸索根據取色筆去實現支持所有背景色圖片的變換,但圖像二值化至今未理解透徹。
?
總結
以上是生活随笔為你收集整理的Python证件照背景自定义改色,带Tkinter界面,代码全文解释!的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 《数据库原理》——知识点总结(期末复习)
- 下一篇: [python 学习笔记] openp