图像特征之傅里叶描述子

使用C++、opencv获取轮廓的傅里叶描述子

傅里叶描述子是一种图像特征,具体来说,是一个用来描述轮廓的特征参数。其基本思想是用物体边界信息的傅里叶变换作为形状特征,将轮廓特征从空间域变换到频域内,,提取频域信息作为图像的特征向量。即用一个向量代表一个轮廓,将轮廓数字化,从而能更好地区分不同的轮廓,进而达到识别物体的目的。

关于傅里叶描述子的概述可参考论文(
http://www.doc88.com/p-7176387138708.html)的2.3节。

在冈萨雷斯的《数字图象处理》一书中介绍了傅里叶描述子的详细原理:

总结:傅立叶描述子可以很好地描述轮廓特征,并且只需少量的描述子(即向量中的数不需要太多)即可大致代表整个轮廓。其次,对傅立叶描述字进行简单的归一化操作后,即可使描述子具有平移、旋转、尺度不变性,即不受轮廓在图像中的位置、角度及轮廓的缩放等影响,是一个鲁棒性较好的图像特征。

注:代码适用于物体已大致分割出来,并且图像中只存在1个目标物体的情况,其他情况需要视需求改代码。

#include 'stdafx.h'#include <opencv2/opencv.hpp> #include <iostream> #include <math.h> #include <opencv2/imgproc/imgproc.hpp>#include <opencv2/core/core.hpp>#include <opencv2/highgui/highgui.hpp>using namespace cv;using namespace std;int main(){//读取图像Mat src_image = imread('D:\\4.PNG');//图像读取出错处理if (!src_image.data){cout << 'src image load failed!' << endl;return -1;}//显示源图像namedWindow('原图', WINDOW_NORMAL);imshow('原图', src_image);//此处高斯去燥有助于后面二值化处理的效果//Mat blur_image;//GaussianBlur(src_image, blur_image, Size(15, 15), 0, 0);//imshow('GaussianBlur', blur_image);/*灰度变换与二值化*/Mat gray_image, binary_image;cvtColor(src_image, gray_image, COLOR_BGR2GRAY);threshold(gray_image, binary_image, 30, 255, THRESH_BINARY | THRESH_TRIANGLE);imshow('binary', binary_image);/*形态学闭操作*/Mat morph_image;Mat kernel = getStructuringElement(MORPH_RECT, Size(3, 3), Point(-1, -1));morphologyEx(binary_image, morph_image, MORPH_CLOSE, kernel, Point(-1, -1), 2);imshow('morphology', morph_image);/*查找外轮廓*/vector< vector<Point> > contours;vector<Vec4i> hireachy;findContours(binary_image, contours, hireachy, CV_RETR_EXTERNAL, CHAIN_APPROX_NONE, Point());int l;//目标轮廓索引//寻找最大轮廓,即目标轮廓for (size_t t = 0; t < contours.size(); t++){/*过滤掉小的干扰轮廓*/Rect rect = boundingRect(contours[t]);if (rect.width < src_image.cols / 2)continue;//if (rect.width >(src_image.cols - 20))l = t;//找到了目标轮廓,获取轮廓的索引}//画出目标轮廓Mat result_image = Mat::zeros(src_image.size(), CV_8UC3);vector< vector<Point> > draw_contours;draw_contours.push_back(contours[l]);drawContours(result_image, draw_contours, -1, Scalar(255,255,255), 1, 8, hireachy);namedWindow('lunkuo', WINDOW_NORMAL);imshow('lunkuo', result_image);//计算轮廓的傅里叶描述子Point p;int x, y, s;int i = 0,j = 0,u=0;s = (int)contours[l].size();Mat src1(Size(s,1),CV_8SC2);float f[9000];//轮廓的实际描述子float fd[16];//归一化后的描述子,并取前15个for (u = 0; u < s; u++){float sumx=0, sumy=0;for (j = 0; j < s; j++){p = contours[l].at(j);x = p.x;y = p.y;sumx += (float)(x*cos(2*CV_PI*u*j/s) + y*sin(2 * CV_PI*u*j / s));sumy+= (float)(y*cos(2 * CV_PI*u*j / s) - x*sin(2 * CV_PI*u*j / s));}src1.at<Vec2b>(0, u)[0] = sumx;src1.at<Vec2b>(0, u)[1] = sumy;f[u] = sqrt((sumx*sumx)+(sumy*sumy));}//傅立叶描述字的归一化f[0] = 0;fd[0] = 0;for (int k = 2; k < 17; k++){f[k] = f[k] / f[1];fd[k - 1] = f[k];cout << fd[k-1] << endl;}//保存数据for (int k = 0; k < 16; k++){FILE *fp = fopen('1.txt', 'a');fprintf(fp, '%8f\t', fd[k]); fclose(fp);}FILE *fp = fopen('1.txt', 'a');fprintf(fp, '\n');fclose(fp);waitKey();return 0;}

源图像:

二值化图像、轮廓图:

将源图像进行旋转、放大操作后的图像:

二值化图像、轮廓图:

两次得到的傅里叶描述子向量如下所示:

可以看到两次得到的向量的对应元素值还是很相近的。

(0)

相关推荐

  • opencv笔记(二十九)——提取轮廓相关函数使用方法

    opencv中常用的跟轮廓相关的操作有:findContours()查找轮廓:drawContours()画轮廓:轮廓填充:计算轮廓的面积和周长:提取轮廓凸包,矩形,最小外接矩形,外接圆等.它们都有相 ...

  • 【OpenCV读取标记点坐标】管道测速

    文章目录 一.项目简介 二.思考步骤 1. 图像二值化 2. 滤波去噪 3. Canny算法检测边缘 4. 查找轮廓并计算 5. 绘制轮廓并表示质心 三.测试结果 四.工程代码 一.项目简介 昨天一个 ...

  • OpenCV探索之路(十一):轮廓查找和多边形包围轮廓

    Canny一类的边缘检测算法可以根据像素之间的差异,检测出轮廓边界的像素,但它没有将轮廓作为一个整体.所以要将轮廓提起出来,就必须将这些边缘像素组装成轮廓. OpenCV中有一个很强大的函数,它可以从 ...

  • 【从零学习OpenCV 4】图像矩的计算与应用

    重磅干货,第一时间送达 经过几个月的努力,小白终于完成了市面上第一本OpenCV 4入门书籍<从零学习OpenCV 4>.为了更让小伙伴更早的了解最新版的OpenCV 4,小白与出版社沟通 ...

  • OPENCV之寻找并绘制轮廓以及提取轮廓重心坐标

    OPENCV之寻找并绘制轮廓以及提取轮廓重心坐标 1.寻找轮廓 声明:在寻找图像轮廓之前需要对图像进行阈值分割或者Canny.拉普拉斯等边缘检测算子处理. 寻找轮廓的算子: findContours( ...

  • 基于OpenCV实战:绘制图像轮廓(附代码)

    重磅干货,第一时间送达 山区和地形图中海拔高的区域划出的线称为地形轮廓,它们提供了地形的高程图.这些线条可以手动绘制,也可以由计算机生成.在本文中,我们将看到如何使用OpenCV在简单图像上绘制轮廓线 ...

  • 基于OpenCV的车辆变道检测

    重磅干货,第一时间送达 本期教程我们将和小伙伴们一起研究如何使用计算机视觉和图像处理技术来检测汽车在行驶中时汽车是否在改变车道!大家一定听说过使用OpenCV 的haar级联文件可以检测到面部.眼睛等 ...

  • 无需深度学习即可提取图像特征

    重磅干货,第一时间送达 一.简介 图像分类是数据科学中最热门的领域之一,在本文中,我们将分享一些将图像转换为特征向量的技术,可以在每个分类模型中使用. 二.定义 VATbox,作为n一个我们所暗示的, ...

  • 南宁中考数学:2021年5月南宁四大学区二模T12解析:二次函数的图像特征

    [2021年南宁四大学区5月二模T12]已知二次函数y=x²-2bx+2b²-4c(其中x是自变量)的函数图像经过不同两点A(1-b,m),B(2b+c,m),且该二次函数图像于x轴有公共点,则b+c ...

  • 图像特征点|ORB特征点

    小白继续和小伙伴们一起学习图像特征点.今天我们来学习的最近十分流行的ORB特征点.该特征点由于其提取速度快.抗干扰能力强被广泛的应用在SLAM技术中.那么ORB特征点到底是何方神圣,等小白一点点解开神 ...

  • 图像特征点|SUSAN特征

    小白在前面分别介绍了:Moravec特征和Harris特征.今天我们将介绍另外一个特征检测算子---SUSAN特征.SUSAN算子很好听的一个名字,其实SUSAN算子除了名字好听外,她还很实用,而且也 ...

  • 图像特征点|Harris特征点

    小白学视觉公众号开始有偿征稿啦~~~,有兴趣的小伙伴可以查看<双十一后,小白教你拒绝吃土!!!> 小白在之前的为小伙伴在前面的推送中带来了moravec算子,忘记了的小伙伴可以回过去看一下 ...

  • 图像特征点|Moravec特征点

    小白好久没有写文章了,近期的事情比较多,公众号的好多事情都是由师弟们在处理,今天终于抽出点时间可以和小伙伴们共同学习.本次为小伙伴们带来的是图像特征专题,Moravec特征点的原理与提取. 当我们描述 ...

  • (26条消息) 图像特征有:颜色特征、纹理特征、形状特征、空间关系

    一 颜色特征 (一)特点:颜色特征是一种全局特征,描述了图像或图像区域所对应的景物的表面性质.一般颜色特征是基于像素点的特征,此时所有属于图像或图像区域的像素都有各自的贡献.由于颜色对图像或图像区域的 ...

  • 长期被忽视的5大和田子玉鉴定特征

    (一)皮光 这个词本身在业界中就鲜有人提及,它近似于古玩行中所说的"皮壳".体现为子玉表层由于长年经自然摩擦而产生的油亮光泽,其效果接近于熟牛皮表面的光泽.虽然并非是每颗子玉都具备 ...

  • 脂粉感”——最易被忽视的和田子玉鉴定特征

    对于和田子玉的鉴定,人们往往专注于皮色.毛孔.丁字纹.水草花等易于形容的具象特征,至于相对抽象的玉质指标,大家最多研究一下油润度.细腻度这几个名词."脂粉感"在现实生活中不过是被应 ...