""" 可视化的自动抠图器.py 这是有可视化界面的自动抠图器,方便初级使用者 使用方法,打开图像后,用鼠标指针选择要抠的区域,然后按抠图按钮。 要保存为jpg图像! """ __author__ = '李兴球' __date__ = '2020/5/6 21:36' __blog__ = 'www.lixingqiu.com' import os import cv2 import numpy as np from tkinter import * from PIL import Image,ImageTk from tkinter import filedialog def cv_imread(file_path): """解决opencv的imread不能读取中文路径的问题""" cv_img = cv2.imdecode(np.fromfile(file_path,dtype=np.uint8),-1) return cv_img def cv_imwrite(file_path): """解决opencv的imread不能读取中文路径的问题""" cv_img = cv2.imdecode(np.fromfile(file_path,dtype=np.uint8),-1) return cv_img def mousedown_event(event): """按下处理""" global startx,starty startx = event.x - 2 starty = event.y - 2 def mousemove_event(event): global endx,endy,rect_item endx = event.x - 2 endy = event.y - 2 rect = (startx,starty,endx,endy) canvas.coords(rect_item,*rect) window.title(rect) def displa_pic(): """在画布中显示这张图像""" global picfilename ,img,image_cv2 #print(picfilename) image_cv2 = cv_imread(picfilename) #print(image_cv2) b,g,r = cv2.split(image_cv2) img = cv2.merge((r,g,b)) im = Image.fromarray(img) img = ImageTk.PhotoImage(image=im) w,h = img.width(),img.height() canvas.configure(width=w,height=h) canvas.itemconfig(canvas.img,image=img) def dig_pic(): """抠图""" global image_cv2 rect = canvas.coords(rect_item) # 左上角坐标和宽高 rect = (int(rect[0]),int(rect[1]) ,int(rect[2]-rect[0]),int(rect[3]-rect[1])) mask = np.zeros(image_cv2.shape[:2], np.uint8) bgModel = np.zeros((1,65), np.float64) fgModel = np.zeros((1,65), np.float64) cv2.grabCut(image_cv2, mask, rect, bgModel, fgModel, 5, cv2.GC_INIT_WITH_RECT) mask2 = np.where((mask == 2) | (mask == 0), 0, 1).astype(np.uint8) out = image_cv2 * mask2[:, :, np.newaxis] #cv2.imshow('风火轮编程自动抠图', out) #cv2.waitKey() # 把out写入到磁盘中,out是一个numpy的2d阵列. file_save = filedialog.asksaveasfilename() #不能保存在中文路径cv2.imwrite(f,out,[int(cv2.IMWRITE_PNG_COMPRESSION),9]) cv2.imencode('.jpg', out)[1].tofile(file_save) def open_pic(): """打开图像函数 options为以下名称: -defaultextension, -filetypes, -initialdir, -initialfile, -multiple, -parent, -title, or -typevariable """ global picfilename # 全局变量,要处理的图像文件名 options = {'initialdir':os.getcwd(), 'filetypes':[('png图像', '.png'), ('jpg图像', '.jpg'), ('jpeg图像', '.jpeg'), ('gif图像', '.gif'), ('bmp图像', '.bmp'), ('all files', '*.*')]} picfilename = filedialog.askopenfilename(**options) if picfilename !=None or picfilename!="": displa_pic() startx,starty,endx,endy = 0,0,0,0 rect_item = 0 picfilename = '' image_cv2 = None window = Tk() window.title('可视化的自动抠图器_作者:李兴球 www.lixingqiu.com') canvas = Canvas(window,width=1,height=1,bg="#e3e3e3") canvas.pack(side=LEFT) open_btn = Button(window,text='打开图像',command=open_pic) open_btn.pack(side=RIGHT) dig_btn = Button(window,text='抠图',command=dig_pic) dig_btn.pack(side=RIGHT) img = PhotoImage(width=1, height=1) img.blank() canvas.img = canvas.create_image(0,0,anchor=NW,image=img) rect_item = canvas.create_rectangle(startx,starty,endx,endy,width=4,outline='red') canvas.bind("",mousedown_event) canvas.bind(" ",mousemove_event) window.mainloop()
可视化的自动抠图器
