如何给图像分类
这个课题是我上学期应该做的,结果拖到现在才完成,有点不好意思,做完了才发现很简单,但是就是平时偷懒,呵呵。现在来记录各个步骤,以便以后的研究。
前提是给风景图像和卡通图像分类。使用的工具是SVM-KM,基于matlab平台。
1。准备200多幅用于训练的图像,一般采用jpg的,因为是彩色图像便于识别,最好用相同尺寸的,比如桌面背景的这种图片。
2。采用特征提取算法对这些图像进行提取。我采用的是颜色直方图算法。因为网上对颜色直方图的解释说明比较少,所以自己编写了一个。主要思路就是对jpg图像进行RGB分解,然后再以R,G,B为空间坐标轴的基础上让图像的所有像素点投影上去,最后统计每个立体小方格中的像素数,最后映射到二维矩阵中。立体小方格的排列次序是自定的,只要所有图像遵从相同的标准即可。
3。上面一步得到的是一个矩阵。假如小方格统计出来有512个,那么每一个特征相当于是512维,所以最后的矩阵就是200*512的,每一行代表一个图像。在SVM中用xapp来表示,进行输入。
4。接着输入yapp,即训练图像的分类,为了给机器一个先验知识。假设风景图像是1,那么卡通图像是-1,最后得到的是200*1的矩阵,由1和-1表示。同样要在SVM中输入。
5。选择合适的核函数,比如“htrbf”或者“poly”或者“guassian”等等,根据不同的核函数来选择不同的参数输入。通用的训练函数为
[xsup,w,w0,tps,alpha] = svmclassLS(xapp,yapp,C,lambda,kernel,kerneloption,verbose,phi,qpsize);
讲xapp和yapp输入后训练得到的结果。
6。选择另外的图像,用与2中相同的方法对图像进行特征提取,同样得到特征矩阵xtest是n*512的形式。这个时候将xtest输入进行最后的测试,测试函数为
ypred = svmval(xtest,xsup,w,w0,kernel,kerneloption,ones(length(xtest),1));
ypred就是结果。其中容易犯错的是length(xtest)其实这个参数就是要测试的图像数量,一般情况都是n>>512的,但是当n<512时就可以直接输入n以免发生错误。
7。最后得到的ypred矩阵一定是n*1形式的,根据结果就可以判断分类结果了。
至于画图还没有研究,有待以后继续,呵呵。