
Python程序代码如下:
import numpy as np
from tkinter import *
#import tkinter
from PIL import Image, ImageTk
#from scipy.misc import imread
import imageio
import matplotlib.pyplot as plt
from sklearn.svm import SVC
class SVM_Classifier(Frame):
def __init__(self, master=None):
self.root = Tk()#tkinter.TK()
Frame.__init__(self, master)
Pack.config(self)
self.menus()
self.createWidgets()
self.after(10, self.callback)
self.state=0
global X_list
X_list=[]
global y_list
y_list=[]
def menus(self):
allmenu = Menu(self.root)#tkinter.Menu
# 添加子菜单
menu1 = Menu(allmenu, tearoff=0)
menu2=Menu(allmenu, tearoff=0)
# 添加选项卡
menu1.add_command(label='前景', command=self.target)
menu1.add_command(label='背景', command=self.background)
allmenu.add_cascade(label='样本标注', menu=menu1)
menu2.add_command(label='SVM学习并显示结果', command=self.processing)
allmenu.add_cascade(label='分析处理', menu=menu2)
self.root.config(menu=allmenu)
def target(self):
self.state=1
def background(self):
self.state=2
def processing(self):
self.state=0
X=np.array(X_list)
y=np.array(y_list)
# print(X)
# print(y)
clf=SVC(kernel="linear", C=0.025)#SVC(gamma=2, C=1)
clf.fit(X, y)
score = clf.score(X, y)
print('score=',score)
#image = imread("lemon.jpg")#fruits.png
image = imageio.imread("./data/lemon.jpg") # fruits.png
XX=[]
for i in range(image.shape[0]):
for j in range(image.shape[1]):
XX.append([image[i,j,0],image[i,j,1],image[i,j,2]])
Z=clf.decision_function(XX)
ZZ=np.array(Z)
ZZ=ZZ.reshape(image.shape[0],image.shape[1])
for i in range(image.shape[0]):
for j in range(image.shape[1]):
if ZZ[i,j]<0:
image[i,j,0]=0
image[i,j,1]=0
image[i,j,2]=0
# for i in range(image.shape[0]):
# for j in range(image.shape[1]):
# Z = clf.decision_function([[image[i,j,0],image[i,j,1],image[i,j,2]]])
# if Z[0]<0:
# image[i,j,0]=0
# image[i,j,1]=0
# image[i,j,2]=0
plt.imshow(image)
plt.show()
def createWidgets(self):
## The playing field
self.draw = Canvas(self, width=640, height=480)
self.im=Image.open('./data/lemon.jpg')#fruits.png
self.tkimg=ImageTk.PhotoImage(self.im)
self.myImg=self.draw.create_image(0,0,anchor=NW,image=self.tkimg)
self.draw.pack(side=LEFT)
def mouse_pick(self,event):
if self.state == 1 or self.state == 2:
rgb=self.im.getpixel((event.x-10,event.y-10))
print("clicked at:x=", event.x-10,'y=',event.y-10,' r=',rgb[0],'g=',rgb[1],'b=',rgb[2])
X_list.append([np.float64(rgb[0]),np.float64(rgb[1]),np.float64(rgb[2])])
if self.state==1:
self.pick_points = self.draw.create_oval((event.x – 2),(event.y – 2),(event.x + 2),(event.y + 2),fill="red")
y_list.append(1)
if self.state==2:
self.pick_points = self.draw.create_oval((event.x – 2),(event.y – 2),(event.x + 2),(event.y + 2),fill="green")
y_list.append(-1)
def callback(self, *args):
self.draw.tag_bind(self.myImg, "<Button-1>", self.mouse_pick)
game = SVM_Classifier()
game.mainloop()
这个程序实现了一个基于支持向量机(SVM)的图像前景背景分离工具,主要功能是通过用户交互来标注前景和背景,然后训练SVM模型来自动去除图像背景。
一、核心功能
- 用户可以点击图像来标注前景(红色点)和背景(绿色点)
- 通过菜单选择"前景"或"背景"模式进行标注
- 使用标注的RGB像素值作为特征训练SVM分类器
- 采用线性核函数的SVC模型
- 对图像中的每个像素进行分类
- 将被分类为背景的像素设置为黑色(0,0,0)
二、详细逻辑流程
1. 初始化阶段
- 导入必要的库(numpy, tkinter, PIL, imageio, matplotlib, sklearn)
- 创建GUI界面,加载./data/lemon.jpg图像
- 初始化全局变量X_list和y_list用于存储标注数据
2. 交互式标注阶段
- 用户通过菜单选择"前景"(状态1)或"背景"(状态2)
- 点击图像时,获取点击位置的RGB值并存储到对应列表
- 在图像上用红色圆点标记前景,绿色圆点标记背景
3. 模型训练与处理阶段
- 将标注数据转换为numpy数组
- 使用SVC(kernel="linear", C=0.025)训练模型
- 计算模型准确率
4. 图像分割阶段
- 遍历图像中每个像素的RGB值
- 使用训练好的模型对每个像素进行分类
- 将分类为背景的像素设为黑色,保留前景像素
三、技术要点
- 特征提取:直接使用RGB三通道值作为像素特征
- 分类算法:使用线性SVM进行像素级别的二分类
- 图像处理:使用PIL库进行图像加载和像素操作
- GUI界面:使用tkinter创建交互式界面
四、程序流程
这是一个典型的交互式图像分割应用,结合了机器学习和图像处理技术,允许用户通过简单的交互操作实现复杂的图像背景去除功能。



