使用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;
}

源图像:

二值化图像、轮廓图:

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

二值化图像、轮廓图:

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

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

图像特征之傅里叶描述子相关推荐

  1. 傅里叶描述子、HOG特征描述子原理及matlab代码

    一.傅里叶描述子 傅里叶描述子的作用是用来描述图像的轮廓信息,具有平移.旋转.尺度不变性特征. 对于一幅图像,通过傅里叶描述子获得其图像轮廓信息,其本质就是空间.频域变换问题.通过将图像中的像素点进行 ...

  2. OpenCV实现傅里叶描述子(下): 形状特征提取

    简述 在前面的更新中 OpenCV实现傅里叶描述子(上): 边界重建 有简单介绍了一下傅里叶描述子的内容,并利用边界的傅里叶描述子对其进行重建,使边界变得更加的平滑.但傅里叶描述子还是以其作为图像中形 ...

  3. image.merge图像有什么变化_图像特征工程:HOG特征描述子介绍

    介绍 在机器学习算法的世界里,特征工程是非常重要的.实际上,作为一名数据科学家,这是我最喜欢的方面之一!从现有特征中设计新特征并改进模型的性能,这就是我们进行最多实验的地方. 世界上一些顶级数据科学家 ...

  4. 图像特征描述子(一)——HOG

    本文主要参考博客:1.https://www.cnblogs.com/panchuangai/p/12567973.html 2.https://blog.csdn.net/weixin_383678 ...

  5. 图像特征点及特征描述子总结

    参考博客 https://blog.csdn.net/qq_28193895/article/details/80845803 https://blog.csdn.net/u013989576/art ...

  6. 图像特征描述子之BRISK

    原文站点:https://senitco.github.io/2017/07/12/image-feature-brisk/   BRISK(Binary Robust Invariant Scala ...

  7. SURF算法与SIFT算法的性能比较——图像特征点检测与提取算法分析

    图像特征点提取算法的算法研究(SURF和SIFT算法) 1. 摘要 计算机视觉中,很大一部分研究集中在图像特征提取和特征生成算法上.对图像的优化,不同于一般数学问题的优化方法,图像的优化是对像素点,在 ...

  8. 图像特征点—SIFT特征点

    图像特征点-SIFT特征点 关于SIFT特征点,以下三篇博客说的非常详细,再次不再赘述. https://mp.weixin.qq.com/s/XVB88f119gRqpwTTRvTyrA https ...

  9. 图像特征点检测与匹配评价准则——量化

    欢迎转载,转载请注明出处,谢谢! 目前图像匹配中,局部特征匹配占据了绝大部分,常用的局部特征匹配方法有Harris.SIFT.SURF.ORB等等,不同的特征点检测和匹配方法尤其独特的优势和不足:  ...

最新文章

  1. 关于C和C++的一点观点
  2. firefox加载不来
  3. Conv2d中的groups参数(分组卷积)怎么理解? 【分组卷积可以减少参数量、且不容易过拟合(类似正则化)】
  4. 【三维深度学习】多视角立体视觉模型R-MVSNet
  5. Oracle定时任务
  6. Struts2前身Struts1是如何转起来的呢
  7. postfix 过滤中文内容
  8. 读《JavaScript权威指南》笔记(三)--对象
  9. spring security3.x学习(3)_初探过滤器机制和auto-config用法
  10. 计算机二级2018VB题库百度云,计算机二级vb题库2017
  11. 情人节程序员用HTML网页表白【表白对话】 HTML5七夕情人节表白网页源码 HTML+CSS+JavaScript
  12. vuex的commit和dispatch
  13. 360怎样修改wifi服务器,360路由器怎么设置无线网络
  14. Jetson TK1 血泪开发记(一)——Jetson TK1初体验
  15. 2019阿里秋招一道笔试题(关于火柴拼出最大数字) - Android开发岗
  16. 群晖6.2开启shr格式
  17. linux查看图形化系统版本,查看 Linux 系统版本信息
  18. 百度博客搜索悄然上线
  19. leetCode1047
  20. 【小程序】如何解决小程左滑删除功能ios的橡皮筋回弹

热门文章

  1. 【HenCoder】HTTPS 为什么是安全的
  2. nacos注册发现原理
  3. 创建一个闪亮的应用程序以使用rtweet和R搜索Twitter
  4. 计算机光驱无法启用,win10系统没法启动光驱怎么解决
  5. Word样式的导入与导出
  6. DIY ROV系列(五)水下机器人通信系统
  7. ESP32驱动 1.3寸OLED SH1106芯片)
  8. Pixelmator Pro比肩Photoshop,专业的图像处理软件,是真的吗?
  9. 【转】ACM比赛经验
  10. PyTorch多进程子进程瘫痪,解决办法