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