1.分割家禽:
将家禽从当前的背景下分割出来,一般有复杂背景和简单背景,先从简单背景说起。通过颜色空间的对比,Lab对家禽分割比较友好。分割的方法有很多,如可以直接在YCrCb颜色空间下进行分割,本次主要说明Lab+Kmeans的方式。
在拿到数据后,要先对数据进行预处理。当前主要是图像增强(具体方式参见之前的图像增强),经过比对,直方图均衡对分割前的效果比较好,选取直方图均衡进行亮度均衡。然后就是将RGB转换到Lab颜色空间,进行Kmeans聚类分割(可以直接调用OpenCV下的Kmeans(参数介绍TermCriteria),kmeans首先要将样本矩阵拉伸,即每个样本为一行,也就是每个像素为一行,然后Kmeans,之后对每个类进行上色),之后分割出来的家禽可能整体偏暗(由于背景的原因,背景是纯黑的),可以选择伽玛变换对图像进行增强。
void main()//lab+kmeans分割,提取骨架
{
const int MAX_CLUSTERS = 5;
Vec3b colorTab[] =
{
Vec3b(0, 0, 255),
Vec3b(0, 255, 0),
Vec3b(255, 100, 100),
Vec3b(255, 0, 255),
Vec3b(0, 255, 255)
};
Mat data, labels;
Mat pic = imread("C:/Users/Administrator/Desktop/ckpic/re/gck/29.jpg");//x.jpg
Mat img_pic=pic.clone();
Mat gray(pic.size(), CV_32FC3);
//gammaLight(pic,gray,0.2);
hist(pic,gray);
imshow("src", gray);
cvtColor(gray,pic,CV_BGR2Lab);
for (int i = 0; i < pic.rows; i++)
for (int j = 0; j < pic.cols; j++)
{
Vec3b point = pic.at<Vec3b>(i, j);
Mat tmp = (Mat_<float>(1, 3) << point[0],point[1], point[2]);//
data.push_back(tmp);
}
//根据浏览图片,确定k=3
kmeans(data, 2, labels, TermCriteria(TermCriteria::EPS + TermCriteria::COUNT, 10, 1.0),
3, KMEANS_RANDOM_CENTERS);
int n = 0;
cout <<"label:" <<labels.size() << endl;
cout << "data" << data.size() << endl;
cout << "pic:" << pic.size() << endl;
//显示聚类结果,不同的类别用不同的颜色显示
for (int i = 0; i < pic.rows; i++)
for (int j = 0; j < pic.cols; j++)
{
int clusterIdx = labels.at<int>(n);
pic.at<Vec3b>(i, j) = colorTab[clusterIdx];
n++;
}
imshow("pic", pic);
}
2.分割鸡冠:
经过比对,发现Lab颜色空间的效果最好,故选择Lab颜色空间。主要步骤如下:高斯滤波,转换颜色空间,分离出a分量(Lab中L表示亮度,a表示红到绿,b表示黄到蓝),二值化(OTSU的效果不太好),用二值图像mask原图,得到鸡冠,对二值图腐蚀、膨胀去小白点,查找轮廓,找轮廓外接矩,用ROI在鸡冠图上截取,进一步提取鸡冠。
3.提取特征:
本项目主要是提取鸡冠的颜色特征和纹理特征。颜色特征描述的方式有颜色直方图、颜色矩、颜色集。本次采用颜色矩进行描述。颜色特征主要集中在低阶矩中,所以我只用了一阶矩(平均值)、二阶矩(标准差)、三阶矩(斜度)。
一阶矩:
二阶矩:
三阶矩:
对RGB三个分量分别求颜色矩,将其构成一个1行9列的矩阵。
灰度共生矩阵:
主要参考灰度共生矩阵的原理及实现(特征提取)-OpenCV,灰度共生矩阵,灰度共生矩阵及相关特征值的计算——opencv。简述一下主要计算过程。先遍历像素,找到最大灰度。然后将灰度归到某个灰度等级(现在有8,16,32等级,默认是16),即比较最大灰度和16的大小,如果最大灰度比16打,则每个灰度都除以16,如果小于16,即表明灰度在16的范围内。然后分别求0,45,90,135度的灰度共生矩阵,然后归一化,之后分别求0,45,90,135的灰度共生矩阵的角二阶矩、熵、逆差矩、相关性,然后分别去它们的平均值,即可作为特征。
4.家禽姿态特征提取:
直接从家禽的二值图提取骨架,会受干扰,极大改变骨架,所以必须先进行轮廓的简化。轮廓简化采用多边形逼近的方法(可以直接调用OpenCV中的approxPolyDP),提取骨架用了zhang的快速并行细化算法。参考了两种图像骨架提取算法的研究,改进zhang方法图像细化。然后就是提取特征,主要的特征有:骨架中心点到头部的距离、中心点到脚部的距离、逼近多边形的凹凸性、鸡头鸡尾的y值,鸡头鸡尾端点之间多边形顶点凹凸性。
5.信息融合:
这里主要是决策融合,使用的是DS证据理论(DS证据理论)。其过程涉及到概率,但是OpenCV中的SVM输出的是类别,所以现在使用Platt Scaling(带概率输出的SVM、使用opencv中的分类器返回样本的类别置信度、具有概率估计的多类图像分类),主要就是将SVM中为经过阈值处理的F(x)放到sigmoid中去(这里系数A、B可通过极大似然法求解得到),最后会输出每个类的概率。然后就可以根据DS证据理论算总的每个类的概率,最大概率即为预测的类别。