有关opencv的学习(17)—形态学滤波器检测边缘和角点
一、图像特征类型可被分为以下三种:
边缘、角点、斑点
其中,角点是个很特殊的存在。他们在图像中可以轻易地定位,同时,他们在人造物体场景,比如门、窗、桌等出随处可见。因为
角点位于两条边缘的交点处,代表了两个边缘变化的方向上的点,,所以他们是可以精确定位的二维特征,甚至可以达到亚像素的精
度。且其图像梯度有很高的变化,这种变化是可以用来帮助检测角点的。需要注意的是,角点与位于相同强度区域上的点不同,与物
体轮廓上的点也不同,因为轮廓点难以在相同的其他物体上精确定位。
二、图像处理领域,角点检测算法可归纳为三类:
基于灰度图像的角点检测、基于二值图像的角点检测、基于轮廓曲线的角点检测。
三、角点检测(corner detection)
角点检测(Corner Detection)是计算机视觉系统中用来获得图像特征的一种方法,广泛应用于运动检测、图像匹配、视频跟踪、三维
建模和目标识别等领域中。也称为特征点检测。
现有的角点检测算法并不是都十分的健壮。很多方法都要求有大量的训练集和冗余数据来防止或减少错误特征的出现。另外,角点
检测方法的一个很重要的评价标准是其对多幅图像中相同或相似特征的检测能力,并且能够应对光照变化、图像旋转等图像变化。
图像中的点作为图像的特殊位置,是很常用的一类特征,点的局部特征也可以叫做“关键特征点”(keypoint feature),或“兴趣
点”(interest point),或“角点”(conrner)。
另外,关于角点的具体描述可以有几种:
(1).一阶导数(即灰度的梯度)的局部最大所对应的像素点;
(2).两条及两条以上边缘的交点;
(3).图像中梯度值和梯度方向的变化速率都很高的点;
(4).角点处的一阶导数最大,二阶导数为零,指示物体边缘变化不连续的方向。
四、使用形态学滤波器检测边缘
图像如下所示:
用cv::morphologyEx函数的相关滤波器,检测图像的边缘
代码如下:
#include <iostream>
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/opencv.hpp>using namespace std;
using namespace cv;int main()
{Mat image=imread("/Users/zhangxiaoyu/Desktop/4.png",0);if(image.empty()){ cout<<"Error!/n";return -1;}cv::Mat result;cv::morphologyEx(image, result, cv::MORPH_GRADIENT, cv::Mat());cv::Mat result2;int threshold=35;cv::threshold(result, result2, threshold, 255, cv::THRESH_BINARY);namedWindow("Gradient Image");imshow("Gradient Image",result);namedWindow("Binary Image");imshow("Binary Image",result2);waitKey(0);return 0;}
使用形态学检测角点的过程比较复杂,需要连续使用多个不同的形态学滤波器。需要在构造函数中定义四个不同的结构函数,分别是正方形、菱形、十字形和X形(在下面的例子中,为了简化,所有的结构都固定为5*5).
在角点特征检测过程中,要依次应用所有结构元素,得到角点分布图:
代码如下:
#ifndef MorphoFeatures_h
#define MorphoFeatures_hclass morphoFeatures
{private://用于产生二值图像的阈值int threshold;//用于检测角点的结构元素cv::Mat_<uchar> cross;cv::Mat_<uchar> diamond;cv::Mat_<uchar> square;cv::Mat_<uchar> x;void applyThreshold(cv::Mat &result){if(threshold>0)cv::threshold(result,result,threshold,255,cv::THRESH_BINARY_INV);}public:morphoFeatures():threshold(-1), cross(5,5),diamond(5,5),square(5,5),x(5,5){// 产生十字形结构元素cross<<0,0,1,0,0,0,0,1,0,0,1,1,1,1,1,0,0,1,0,0,0,0,1,0,0;diamond<<0,0,1,0,0,0,1,1,1,0,1,1,1,1,1,0,1,1,1,0,0,0,1,0,0;square<<1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1;x<<1,0,0,0,1,0,1,0,1,0,0,0,1,0,0,0,1,0,1,0,1,0,0,0,1;}void setThreshold(int t) {threshold= t;}int getThreshold() const {return threshold;}cv::Mat getCorners(const cv::Mat &image){cv::Mat result;//用十字形元素膨胀cv::dilate(image,result,cross);//用菱形元素腐蚀cv::erode(result, result, diamond);cv::Mat result2;//用x形元素膨胀cv::dilate(image, result2, x);//用正方形元素腐蚀cv::erode(result2, result, square);//比较两个经过闭合运算的图像,得到角点cv::absdiff(result2, result, result);//应用阈值,获得二值图像applyThreshold(result);return result;}void drawOnImage(const cv::Mat& binary, cv::Mat& image) {cv::Mat_<uchar>::const_iterator it= binary.begin<uchar>();cv::Mat_<uchar>::const_iterator itend= binary.end<uchar>();for (int i=0; it!= itend; ++it,++i) {if (!*it)cv::circle(image,cv::Point(i%image.step,i/image.step),5,cv::Scalar(255,0,0));}}};#endif /* MorphoFeatures_h */
主函数如下:
#include <iostream>
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/opencv.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include "morphoFeatures.h"using namespace cv;
using namespace std;int main( )
{Mat image=imread("/Users/zhangxiaoyu/Desktop/4.png",0);if(image.empty()){cout<<"Error!cannot be read...../n";return -1;}morphoFeatures morpho;morpho.setThreshold(30);//检测角点morpho.setThreshold(-1);cv::Mat corners;corners= morpho.getCorners(image);cv::morphologyEx(corners,corners,cv::MORPH_TOPHAT,cv::Mat());cv::threshold(corners, corners, 30, 255, cv::THRESH_BINARY_INV);//显示角点morpho.drawOnImage(corners,image);cv::namedWindow("Corners on Image");cv::imshow("Corners on Image",image);waitKey(0);}
运行程序,如下图所示:
角点检测使用了四个不同的结构元素,检测过程较为复杂。它的原理是通过使用两个不同的结构元素膨胀和腐蚀图像,从而实现图像的闭合运算。选用这些结构元素后,直线的边缘保持不变。但因为它们各自的作用,拐角处的边缘会受影响。如下图所示:
第一个正方形是原始图像。用十字形结构元素膨胀后,正方形的边缘扩大了,但拐角处没有扩大,中间的正方形就对应这种结果。然后用菱形结构元素腐蚀(膨胀后的)图像。腐蚀运算把大部分边缘都推回到原始位置,但角点因为未被膨胀的原因从而会被推得更远,得到最右边的正方形,可以看到它已经失去了尖角。用X形和正方形结构元素重复上述过程。这两个元素与前面两个类似,因此它们可以捕获旋转了45度的角点。最后比较两个结果,就可以提取出角点特征。
有关opencv的学习(17)—形态学滤波器检测边缘和角点相关推荐
- 利用形态学检测边缘和角点
一.引言 形态学滤波器可以用于检测图像的不同特征,这一节,我们介绍利用形态学检测灰度级图像的边缘和角点. 二.原理介绍 形态学还是将图像的灰度级看成地理里面的"等高线",亮的地方看 ...
- OpenCV Sobel和Scharr (索贝尔和夏尔滤波器检测边缘)
::返回OpenCV算子速查表 OpenCV Sobel和Scharr 1. 函数定义 1.1 声明 1.2 重要参数解析 2. 例程 2.1 处理效果 原图 在x,y方向分别求导 如果两个方向一起求 ...
- Opencv 深度学习识别性别和检测年龄
目录 1基于CNN的性别分类建模原理 1.1 人脸识别 1.2 性别预测 1.3 年龄预测 1.4 结果 2 代码 参考 本教程中,我们将讨论应用于面部的深层学习的有趣应用.我们将估计年龄,并从单个图 ...
- 毕业设计 机器视觉 opencv 深度学习 驾驶人脸疲劳检测系统 -python
文章目录 0 前言 1 课题背景 2 Dlib人脸识别 2.1 简介 2.2 Dlib优点 2.3 相关代码 2.4 人脸数据库 2.5 人脸录入加识别效果 3 疲劳检测算法 3.1 眼睛检测算法 3 ...
- 用定向滤波器检测边缘
放大图像中的高频成分,用高通滤波器进行边缘检测. 我们将要使用的滤波器称为 Sobel 滤波器.因为它只对垂直或水平方向的图像频率起作用(具体方向取决于滤波器选用的内核),所以被认为是一种定向滤波器. ...
- OpenCV Python学习笔记(5)—— 边缘保留滤波(EPF)
1 边缘保留滤波 高斯双边 均值迁移 2 测试 import cv2 as cv import numpy as npdef bi_demo(image):dst = cv.bilateralFilt ...
- OpenCV学习笔记(14):形态学滤波对图像进行边缘及角点检测
</pre><pre name="code" class="cpp">#include "stdafx.h" #in ...
- opencv进阶学习笔记11:cannny边缘检测,直线检测,圆检测
基础版笔记传送门 python3+opencv学习笔记汇总目录(适合基础入门学习) 进阶版笔记目录链接: python+opencv进阶版学习笔记目录(适合有一定基础) cannny边缘检测 基础版边 ...
- 深度学习 + OpenCV,Python实现实时视频目标检测
选自PyimageSearch 机器之心编译 参与:路雪.李泽南 使用 OpenCV 和 Python 对实时视频流进行深度学习目标检测是非常简单的,我们只需要组合一些合适的代码,接入实时视频,随后加 ...
最新文章
- 网易来聊聊子弹短信的消息漫游技术
- git切换路径报错:bash: cd: too many arguments
- 【总结】一文了解所有的机器学习评价指标
- P2774-方格取数问题【网络流,最大流,最小割】
- java provider_Java SPI(Service Provider Interface)
- java.util.function.Function的用法
- 【读书笔记】A Swift Tour
- 安卓应用_接入 微信支付 无法调起支付界面的坑
- 值得推荐的C/C++框架和库 转
- 神经网络算法的基本原理,神经网络算法都有哪些
- win10安装secureCRT8.1.4破解
- i511300h和i51135g7的区别 i5 1135g7和11300h核显对比
- 线上CPU飙升问题排查
- 华三路由交换配置命令_华为-华三交换机路由器命令大全
- 新发的日常小实验——Unity UGUI Image图片镜像对称效果(轴对称)
- ChatGPT翻译怎么样-ChatGPT批量翻译工具软件
- SQLalchemy 转载学习(学习了中间relationship内部cascade参数的部分)
- CPLD国产替代的成熟选择
- 教育期刊《语文教学通讯》杂志简介及投稿须知
- Mysql错误1452 - Cannot add or update a child row: a foreign key constraint fails 怎么办?
热门文章
- Wasserstein Disstance
- git提交出现Another git process seems to be running in this repositorye.g. an editor opened by ‘git commi
- 逍遥安卓模拟器卡android,逍遥安卓模拟器新版本高帧率流畅好用不卡顿
- python word排版_如何基于Python实现word文档重新排版
- 中柏EZpad6plus 安装centos7.9 解决wifi问题,也给自己留个记录。
- 从零基础学摄影nbsp;《摄影新手入…
- a+=b和a=a+b是一样的吗?
- 关于Number()的用法
- Android利用MedioRecorder使用仿微信语音录音以及播放(总结)
- Unity_URP管线下粒子发射多个模型叠加在一起,会有破面的解决方法