opencv:基于不变矩方法的图像特征提取
2017-04-19 20:45
639 查看
在遇到需要对一个图像某个位置的物体进行判断时,一般想到的都是拿已经存储的图像去对比,对比的时候,由于噪声干扰以及多种冗余信息存在的原因,不可能按像素一个个比对,需要对图像特征进行提取,然后再比对。
不变矩指的是物体经过平移、旋转、缩放以及比例变换后仍保持不变的矩特征量。
中心矩定义如下:
upq=∑x∑y(x−x0)p(y−y0)qf(x,y)
对于一个图像,其特征往往通过边缘体现出来,因此可以通过边缘检测找出其边缘点,将边缘点归入矩特征量的计算中。
矩特征量分别为:
使用Opencv中的Canny算子进行边缘检测:
对几个进行了变形的相同图形以及作为对比的一个不同图形的特征值如下:
可以看出形变量较少的特征值比较接近,而对比图形的特征值差异较大,经过分类器训练后,对图像应具有一定的辨识能力。
参考资料:
《图像处理与模式识别》
http://blog.csdn.net/carson2005/article/details/6854024/
http://blog.csdn.net/yang6464158/article/details/42459595
http://blog.csdn.net/xiaowei_cqu/article/details/19839019
不变矩指的是物体经过平移、旋转、缩放以及比例变换后仍保持不变的矩特征量。
中心矩定义如下:
upq=∑x∑y(x−x0)p(y−y0)qf(x,y)
对于一个图像,其特征往往通过边缘体现出来,因此可以通过边缘检测找出其边缘点,将边缘点归入矩特征量的计算中。
矩特征量分别为:
void set_args(){ args.clear(); float m20 = central_M(2, 0); float m02 = central_M(0, 2); float m21 = central_M(2, 1); float m12 = central_M(1, 2); float m30 = central_M(3, 0); float m03 = central_M(0, 3); float m11 = central_M(1, 1); args.push_back(m20 + m02); args.push_back(pow(m20 - m02, 2) + 4 * pow(m11, 2)); args.push_back(pow(m30 - 3 * m12, 2) + pow(3 * m21 - m03, 2)); args.push_back(pow(m30 + m12, 2) + pow(m21 + m03, 2));//4 args.push_back((m30 - 3 * m12)*(m30 + m12)*(pow(m30 + m12, 2) - 3 * pow(m21 + m03, 2)) + (3 * m21 + m03)*(m21 + m03)*(3 * pow(m30 + m12, 2) - pow(m21 + m03, 2))); args.push_back((m20 - m02)*(pow(m30 + m12, 2) - pow(m21 + m03, 2)) + 4 * m11*(m30 + m12)*(m21 + m03));//6 args.push_back(((3 * m21 - m03)*(m30 + m12)*(pow(m30 + m12, 2) - 3 * pow(m21 + m03, 2))) + ((3 * m12 - m30)*(m21 + m03)*(pow(m30 + m12, 2) - 3 * pow(m21 + m03, 2)))); for (auto&var : args){ var = abs(log(abs(var))); } }
使用Opencv中的Canny算子进行边缘检测:
vector<Mat> train_data; for (int i = 1; i < 6; i++){ string filename = "train\\t"; string suffx = ".png"; filename += (char)(i+'0'); filename += suffx; train_data.push_back(imread(filename, CV_LOAD_IMAGE_COLOR)); } for (int i = 0; i < 5; i++){ Mat img_gry; Mat img = train_data[i]; cvtColor(img, img_gry, CV_BGR2GRAY); blur(img_gry, img_gry, Size(3, 3)); Canny(img_gry, cany_dect, thresh, thresh * 3, 3); imshow("cur"+i,cany_dect); Moment mt(cany_dect); mt.set_args(); mt.pirnt_args(); cout << endl; }
对几个进行了变形的相同图形以及作为对比的一个不同图形的特征值如下:
可以看出形变量较少的特征值比较接近,而对比图形的特征值差异较大,经过分类器训练后,对图像应具有一定的辨识能力。
参考资料:
《图像处理与模式识别》
http://blog.csdn.net/carson2005/article/details/6854024/
http://blog.csdn.net/yang6464158/article/details/42459595
http://blog.csdn.net/xiaowei_cqu/article/details/19839019
相关文章推荐
- 数字图像处理10--基于特征提取的拼接方法
- 基于一种改进的提取形状特征向量方法,实现图像检索
- 一种基于特征点匹配的图像检索方法的opencv实现
- opencv2两张图像拼接融合_基于SURF特征提取
- OpenCV用形态学方法进行图像线特征和角点的提取
- 毕业设计基于OpenCV的图像特征提取软件的设计与实现,部分展示
- 【OpenCV】图像特征的提取以及相似性比较方法
- [置顶] 基于opencv-3.4.0的图像特征点提取及图像匹配(Java 版)
- 基于opencv的图像拼接(一): sift特征点提取
- 简单的图像显著性区域特征提取方法-----opencv实现LC,AC,FT
- 【OpenCV学习笔记】之四:二值图像细化方法/骨架提取----基于2.0 Mat接口
- 基于小波多尺度和熵在图像字符特征提取方法的改进
- 图像特征特点及其常用的特征提取与匹配方法
- 图像特征特点及其常用的特征提取与匹配方法
- OpenCV中特征点提取和匹配的通用方法
- OpenCV-基于特征点的图像匹配
- 图像特征特点及其常用的特征提取与匹配方法
- OpenCV中特征点提取和匹配的通用方法
- OpenCV中特征点提取和匹配的通用方法
- 几种基于图像内容检索提征提取方法及比较