【opencv】角点检测——虚线表格

  • 处理对象——虚线表格
  • 处理方法——角点检测
    • Harris角点检测
    • 函数解读
  • 处理结果

处理对象——虚线表格

把之前做研电赛的东西做一点小的分享,先给大家看一下所处理的对象。可以看到我们所面对的表格具有特殊性和复杂性,表格线为虚线,且存在错位情况。在这种情况下想要准确检测出表格区域,并不是容易的事。


我们需要对这种原始图像做较多的预处理,以达到去掉文字干扰的目的,下次的博客可以再对这块进行一个细致的说明。
我制作了一张预处理之后的图片来做算法测试。

处理方法——角点检测

角点检测作为图像处理中对于特征提取与检测的重要方式之一,具有非常广泛的应用空间。
角点的具体描述可以有几种:

  1. 一阶导数(即灰度的梯度)的局部最大所对应的像素点;
  2. 两条及两条以上边缘的交点;
  3. 图像中梯度值和梯度方向的变化速率都很高的点;
  4. 角点处的一阶导数最大,二阶导数为零,指示物体边缘变化不连续的方向。
    角点检测中常用的算法有Harris角点检测和Shi-Tomasi 角点检测算法。Shi-Tomasi 算法是对Harris的改进,今天主要分享Harris算法的运用。

Harris角点检测

当一个窗口在图像上移动,在平滑区域如图(a),窗口在各个方向上没有变化。在边缘上如图(b),窗口在边缘的方向上没有变化。在角点处如图©,窗口在各个方向上具有变化。Harris角点检测正是利用了这个直观的物理现象,通过窗口在各个方向上的变化程度,决定是否为角点。

将图像窗口平移[u,v]产生灰度变化E(u,v)

由:
得到:

对于局部微小的移动量 [u,v],近似表达为:

其中M是 2*2 矩阵,可由图像的导数求得:

E(u,v)的椭圆形式如下图:

定义角点响应函数 R 为:

Harris角点检测算法就是对角点响应函数R进行阈值处理:R > threshold,即提取R的局部极大值。

函数解读

C++:

void cornerHarris(InputArray src,//输入的原图Mat类型,需要为单通道8位或者浮点型图像OutputArray dst, //存放Harris角点检测的输出结果,和原图片有一样的尺寸和类型;int blockSize, //表示邻域的大小,更多详细信息在cornerEigenValsAndVecs()中讲到;int ksize,//表示Sobel()算子的孔径的大小; double k, //Harris参数;通常是0.04int borderType=BORDER_DEFAULT)//图像像素的边界模式。注意它有默认值BORDER_DEFAULT;

我的代码如下,你需要先配置好opencv到VS中,具体操作可以看我之前的博客;

#include<opencv2/opencv.hpp>
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <opencv2\imgproc\types_c.h>//opencv4所不一样的地方
#include <iostream>using namespace cv;
using namespace std;Mat image;
Mat imageGray;
int thresh = 170;
int MaxThresh = 255;void Trackbar(int, void*);  //阈值控制int main()
{image = imread("4.jpg");cvtColor(image, imageGray, CV_RGB2GRAY);GaussianBlur(imageGray, imageGray, Size(5, 5), 1); // 滤波namedWindow("Corner Detected");//,CV_WINDOW_AUTOSIZEcreateTrackbar("threshold:", "Corner Detected", &thresh, MaxThresh, Trackbar);imshow("Corner Detected", image);Trackbar(0, 0);waitKey();return 0;
}void Trackbar(int, void*)
{Mat dst, dst8u, dstshow, imageSource;dst = Mat::zeros(image.size(), CV_32FC1);imageSource = image.clone();cornerHarris(imageGray, dst, 9, 5, 0.04, BORDER_DEFAULT);normalize(dst, dst8u, 0, 255, CV_MINMAX);  //归一化convertScaleAbs(dst8u, dstshow);imshow("dst", dstshow);  //dst显示for (int i = 0; i<image.rows; i++){for (int j = 0; j<image.cols; j++){if (dstshow.at<uchar>(i, j)>thresh)  //阈值判断{circle(imageSource, Point(j, i), 2, Scalar(0, 0, 255), 2); //标注角点cout << Point(j, i);}}}rectangle(imageSource, cvPoint(69, 49), cvPoint(440, 603), cvScalar(0, 0, 255), 2, 4, 0);imshow("Corner Detected", imageSource);
}

处理结果


可以看到在阈值设定合适的情况下,对角点的检测效果还是比较客观的,但阈值的设定存在一定困难,面对不同的图容易出现如下情况,将粗的直线认为是矩形从而检测出过多的角点,我认为为了避免这类情况需要在预处理阶段做出更多干预处理。下一篇博客分享

参考博客:https://blog.csdn.net/qq_27396861/article/details/87898892
https://blog.csdn.net/xiaowei_cqu/article/details/7805206

【opencv】角点检测——虚线表格相关推荐

  1. OpenCV角点检测之Harris角点检测

    本篇文章中,我们一起探讨了OpenCV中Harris角点检测相关的知识点,学习了OpenCV中实现Harris角点检测的cornerHarris函数的使用方法.此博文一共有两个配套的麻雀虽小但五脏俱全 ...

  2. opencv角点检测学习总结

    学习opencv 角点检测 如果一个点在两个正交方向上都有明显的导数,则我们认为此点更倾向于是独一无二的,所以许多可跟踪的特征点都是角点. 一下为角点检测中用到的一些函数 cvGoodFeatures ...

  3. OpenCV角点检测源代码分析(Harris和ShiTomasi角点)

    OpenCV中常用的角点检测为Harris角点和ShiTomasi角点. 以OpenCV源代码文件 .\opencv\sources\samples\cpp\tutorial_code\Trackin ...

  4. OpenCV角点检测: Harris算子, ShiTomasi算子

    角点检测 角点的特征检测与匹配是Computer Vision 应用总重要的一部分,这需要寻找图像之间的特征建立对应关系.点,也就是图像中的特殊位置,是很常用的一类特征,点的局部特征也可以叫做&quo ...

  5. opencv 角点检测

    一.话说角点 三种基本的图像特征 边缘,对应下图黑框部分 角点,对应下图红框部分 团块,对应下图蓝框部分 下面介绍三种经典的角点检测的算法(前方公式高能,非战斗人员可直接跳到API和Demo部分) H ...

  6. OpenCV——角点检测原理分析(Harris,Shi-Tomasi、亚像素级角点检测)

    一.角点(corner) 角点通常被定义为两条边的交点,或者说,角点的局部邻域应该具有两个不同区域的不同方向的边界.角点检测(Corner Detection)是计算机视觉系统中获取图像特征的一种方法 ...

  7. opencv——角点检测

    一:角点检测 什么是角点,难道是角落里面的点?我们知道,比如说墙角,他有往左延申的边缘,又有往右延申的边缘,那么这样的概念同样可以帮助我们理解图像的角点检测. 其实我们人眼对于角点的识别是通过一个小窗 ...

  8. OpenCV——角点检测 (Corner Detection)

    角点 角点通常被定义为两条边的交点,或者说,角点的局部邻域应该具有两个不同区域的不同方向的边界.角点检测(Corner Detection)是计算机视觉系统中获取图像特征的一种方法,广泛应用于运动检测 ...

  9. OpenCV —— 角点检测之 Harris 角点检测、Shi-Tomasi 角点检测、FAST 角点检测

    角点检测 Harris 角点检测 实现原理 OpenCV 函数 优化 Shi-Tomasi 角点检测 实现原理 OpenCV 函数 FAST 角点检测 实现原理 OpenCV 函数 优化 在图像处理和 ...

最新文章

  1. python中语法错误-python冒号语法错误python中如何创建字典
  2. JDBC 此驱动程序不支持 Java Runtime Environment (JRE) 1.6 版
  3. 深度学习100例 - 卷积神经网络(Inception V3)识别手语 | 第13天
  4. 502 Bad Gateway nginx 解决
  5. [原]排错实战——拯救加载调试符号失败的IDA
  6. android怎样禁用整个布局点击,Android - 自动禁用布局里的所有子控件
  7. Java记录 -9- 面向对象之封装
  8. MACOSX下查看某个端口被哪个程序占用及杀进程方法
  9. iOS的view翻转动画实现--代码老,供参考
  10. discuz自动添加兼容html5标签的音乐播放器
  11. 番茄花园 Ghost XP SP3 极速装机版 V2013.05
  12. Spring学习笔记(入门)
  13. 我的第一次WebService接口开发教程
  14. Android异步通信:深入剖析Handler机制源码
  15. Python爬取美女图片 爬虫基础
  16. 【Java基础】2020如何查看Java官方文档
  17. 随心所欲b超工作站图像处理_第七讲随心所欲版医学影像工作站软件每周一题...
  18. python利用range生成包含1-10的列表_Python列表干货:创建数字列表:range()函数用法...
  19. 如何调用openai
  20. 使用DIV、CSS技术设计的个人博客网页(web期末考试)

热门文章

  1. java记事本课程设计_课程设计(部分代码)之java版(记事本)
  2. 化妆品在管理系统中如何分类?
  3. 努力的天才-一代K神(克洛泽)
  4. 开放式耳机推荐哪款最好、性价比最高的开放式耳机
  5. 雅虎天气API 多语言参数
  6. KODI播放器连接tfcenter webdav文件服务
  7. android string.trim,String.Trim 方法 (System) | Microsoft Docs
  8. 当当api 详情接口
  9. 曾经的iOS 9,为前端世界都带来了些什么?
  10. Android与JNI(一)