家禽检测

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.提取特征:

本项目主要是提取鸡冠的颜色特征和纹理特征。颜色特征描述的方式有颜色直方图、颜色矩、颜色集。本次采用颜色矩进行描述。颜色特征主要集中在低阶矩中,所以我只用了一阶矩(平均值)、二阶矩(标准差)、三阶矩(斜度)。

一阶矩:

                 u=\frac{1}{N}\sum_{i=1,j=1}^{N}P_{i,j}

二阶矩:

               \sigma= (\frac{1}{N}\sum (P_{i,j}-u)^{2})^{\frac{1}{2}}

三阶矩:

              s= (\frac{1}{N}\sum (P_{i,j}-u)^{3})^{\frac{1}{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证据理论算总的每个类的概率,最大概率即为预测的类别。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值