形态学滤波(3):使用形态学滤波对图像进行边缘及角点检测.

  1 #include<opencv2/opencv.hpp>
  2 #include<iostream>
  3
  4 using namespace std;
  5 using namespace cv;
  6
  7 //首先定义MorphoFeatures类,我们将使用它来检测图像特征
  8 class MorphoFeatures {
  9 private:
 10     int threShold;  //用于生成二值图像的阈值
 11     Mat cross;      //角点检测中用到的结构元素
 12     Mat diamond;
 13     Mat square;
 14     Mat x;
 15 public:
 16     /*
 17         使用形态学检测角点,OpenCV没有直接实现它。这是一个很好的使用非方形结构元素的例子。
 18         事实上,它需要定义四种不同的结构元素,包括方形、菱形、十字形以及X形,这都是在构造
 19         函数中完成的(简单起见,所有元素的尺寸都固定为5*5)
 20     */
 21     MorphoFeatures() :threShold(-1), cross(5, 5, CV_8U, Scalar(0)),
 22         diamond(5, 5, CV_8U, Scalar(0)),
 23         square(5, 5, CV_8U, Scalar(0)),
 24         x(5, 5, CV_8U, Scalar(0)) {
 25         //创建十字形元素
 26         for (int i = 0; i < 5; i++) {
 27             cross.at<uchar>(2, i) = 1;
 28             cross.at<uchar>(i, 2) = 1;
 29         }
 30
 31         //创建菱形元素
 32         diamond.at<uchar>(0, 0) = 0;
 33         diamond.at<uchar>(0, 1) = 0;
 34         diamond.at<uchar>(1, 0) = 0;
 35         diamond.at<uchar>(4, 4) = 0;
 36         diamond.at<uchar>(3, 4) = 0;
 37         diamond.at<uchar>(4, 3) = 0;
 38         diamond.at<uchar>(4, 0) = 0;
 39         diamond.at<uchar>(4, 1) = 0;
 40         diamond.at<uchar>(3, 0) = 0;
 41         diamond.at<uchar>(0, 4) = 0;
 42         diamond.at<uchar>(0, 3) = 0;
 43         diamond.at<uchar>(1, 4) = 0;
 44
 45         //创建X形元素
 46         for (int i = 0; i < 5; i++) {
 47             x.at<uchar>(i, i) = 1;
 48             x.at<uchar>(4-i, i) = 1;
 49         }
 50     }
 51
 52     //在检测角点特征的过程中,需要接连使用这些结构元素以得到最终的角点映射图
 53     Mat getCorners(const Mat &image) {
 54         Mat result;
 55         //十字形膨胀
 56         dilate(image, result, cross);
 57         //菱形腐蚀
 58         erode(result, result, diamond);
 59
 60         Mat result2;
 61
 62         //X形膨胀
 63         dilate(image, result2, x);
 64         //方形腐蚀
 65         erode(result2, result2, square);
 66
 67         //通过对两张图像做差值得到角点图像
 68         absdiff(result2, result, result);
 69         //阈值化以得到二值图像
 70         applyThreshold(result);
 71
 72         return result;
 73     }
 74     //为了更好的可视化检测的结果,使用下述方法在二值图像中的每个检测点上绘制一个园
 75     void drawOnImage(const Mat &binary, Mat &image) {
 76         Mat_<uchar>::const_iterator it = binary.begin<uchar>();
 77         Mat_<uchar>::const_iterator itend = binary.end<uchar>();
 78
 79         //遍历每个像素
 80         for (int i = 0; it != itend; ++it, ++i) {
 81             if (!*it)
 82                 circle(image, Point(i%image.step, i / image.step), 5, Scalar(255, 0, 0));
 83         }
 84     }
 85     void setThreshold(int t) {
 86         threShold = t;
 87     }
 88     Mat getEdges(const Mat & image) {
 89         //得到梯度图
 90         Mat result;
 91         morphologyEx(image, result, MORPH_GRADIENT, Mat());
 92
 93         //阈值化得到二值图像
 94         applyThreshold(result);
 95         return result;
 96     }
 97
 98     void applyThreshold(Mat &result) {
 99         if (threShold > 0)
100             threshold(result, result, threShold, 255, THRESH_BINARY);
101     }
102 };
103
104
105 int main()
106 {
107     Mat    image = imread("C:\\Users\\Administrator\\Pictures\\Camera Roll\\07.jpg");
108
109     //创建形态学特征实例
110     MorphoFeatures morpho;
111     //morpho.setThreshold(40);
112
113     //获取边缘
114     Mat edges;
115     edges = morpho.getEdges(image);
116
117     //得到角点
118     Mat corners;
119     corners = morpho.getCorners(image);
120
121     namedWindow("边缘");
122     imshow("边缘", edges);
123
124     namedWindow("角点");
125     imshow("角点", corners);
126
127     waitKey();
128     return 0;
129 }
130     
时间: 2024-10-11 11:45:57

形态学滤波(3):使用形态学滤波对图像进行边缘及角点检测.的相关文章

opencv对图像进行边缘及角点检测

opencv对图像进行边缘及角点检测 先看结果: 代码: // ConsoleApplication1_812.cpp : Defines the entry point for the console application. // #include "stdafx.h" #include "opencv2/opencv.hpp" class Imagedetector{ public: Imagedetector():threshold(-1) ,cross(5

图像特征检测之Harris角点算法

        图像检测是图像分割,图像识别的基础,也是不可缺少的关键.在视觉计算理论框架中,抽取二维图像的边缘.角点.纹理等基本特征,是整个框架的第一步:本文章对Harris角点算法做了比较详细的理论介绍以及相关实现. Part One:角点类型介绍 在现实世界中,角点对应于物体的拐角,道路的十字路口.丁字路口等.从图像分析的角度来定义角点可以有以下两种定义: 角点可以是两个边缘的角点: 角点是邻域内具有两个主方向的特征点                                    

OpenCV2学习笔记(三):形态学及边缘角点检测

形态学滤波理论于上世纪90年代提出,目前被广泛用于分析及处理离散图像.其基本运算有4个: 膨胀.腐蚀.开启和闭合, 它们在二值图像和灰度图像中各有特点.基于这些基本运算还可推导和组合成各种数学形态学实用算法,用它们可以进行图像形状和结构的分析及处理,包括图像分割.特征抽取.边缘检测. 图像滤波.图像增强和恢复等.数学形态学方法利用一个称作结构元素的"探针"收集图像的信息,当探针在图像中不断移动时, 便可考察图像各个部分之间的相互关系,从而了解图像的结构特征.数学形态学基于探测的思想,与

学习 opencv---(7) 线性邻域滤波专场:方框滤波,均值滤波,高斯滤波

本篇文章中,我们一起仔细探讨了OpenCV图像处理技术中比较热门的图像滤波操作.图像滤波系列文章浅墨准备花两次更新的时间来讲,此为上篇,为大家剖析了"方框滤波","均值滤波","高斯滤波"三种常见的邻域滤波操作.而作为非线性滤波的"中值滤波"和"双边滤波",我们下次再分析. 因为文章很长,如果详细啃的话,或许会消化不良.在这里给大家一个指引,如果是单单想要掌握这篇文章中讲解的OpenCV线性滤波相关的三个函

Atitit &#160;&#160;图像处理&#160;平滑&#160;也称&#160;模糊,&#160;归一化块滤波、高斯滤波、中值滤波、双边滤波)

Atitit   图像处理 平滑 也称 模糊, 归一化块滤波.高斯滤波.中值滤波.双边滤波) 是一项简单且使用频率很高的图像处理方法 用途 去噪 去雾 各种线性滤波器对图像进行平滑处理,相关OpenCV函数如下: 归一化块滤波器 (Normalized Box Filter) § 最简单的滤波器, 输出像素值是核窗口内像素值的 均值 ( 所有像素加权系数相等) § 高斯滤波器 (Gaussian Filter) § 最有用的滤波器 (尽管不是最快的). 高斯滤波是将输入数组的每一个像素点与 高斯

均值滤波,中值滤波,最大最小值滤波

http://blog.csdn.net/fastbox/article/details/7984721 讨论如何使用卷积作为数学工具来处理图像,实现图像的滤波,其方法包含以下几种,均值 滤波,中值滤波,最大最小值滤波,关于什么是卷积以及理解卷积在图像处理中作用参见这 里–http://blog.csdn.net/jia20003/article/details/7038938 均值滤波: 均值滤波,是图像处理中最常用的手段,从频率域观点来看均值滤波是一种低通滤波器,高 频信号将会去掉,因此可以

空域高斯滤波与频域高斯滤波

卷积定理 函数空间域的卷积的傅里叶变换是函数傅里叶变换的乘积.对应地,频率域的卷积与空间域的乘积存在对应关系. 即: 由卷积定理可知所有频域的滤波理论上都可以转化为空域的卷积操作. 给定频率域滤波器,可对其进行傅里叶逆变换得到对应的空域滤波器:滤波在频域更为直观,但空域适合使用更 小的滤波模板以提高滤波速度.因为相同尺寸下,频域滤波器效率高于空域滤波器,故空域滤波需要一个更小尺 寸的模板近似得到需要的滤波结果. 空域卷积 将模板在图像中逐像素移动,将卷积核的每个元素分别和图像矩阵对应位置元素相乘

数学之路-python计算实战(17)-机器视觉-滤波去噪(中值滤波)

Blurs an image using the median filter. C++: void medianBlur(InputArray src, OutputArray dst, int ksize) Python: cv2.medianBlur(src, ksize[, dst]) → dst Parameters: src – input 1-, 3-, or 4-channel image; when ksize is 3 or 5, the image depth should

图像平滑技术之盒滤波、均值滤波、中值滤波、高斯滤波、双边滤波的原理概要及OpenCV代码实现

图像平滑是指直接对源图像的每个像素数据做邻域运算以达到平滑图像的目的.实质上主要就是通达卷积核算子实现的,卷积核算子的相关知识大家可以参考我写的博文http://blog.csdn.net/wenhao_ir/article/details/51691410 图像平滑也称为模糊或滤波,是图像处理中常用的技术之一,进行平滑处理时需要用到滤波器核(其实就是卷积核算子),根据滤波器核函数来实现不同的滤波技术.下面介绍几种 常用的图像平滑方法的大概原理及OpenCV下的实现代码. 一.盒滤波(均值滤波)