形态学边缘检测方法

边缘检测方面现状:

边缘检测是数字图像处理识别物体重要的预处理方法,Sobel,Robert,Prewitt,Log等等算子实现方便,处理很快,但是很容易被噪声影响。现实场景的应用噪声都是很多的,canny算子加入了平滑滤波器对这方面问题非常有效,平滑滤波器将会直接影响 Canny 算法的结果。较小的滤波器产生的模糊效果也较少,这样就可以检测较小、变化明显的细线。较大的滤波器产生的模糊效果也较多,将较大的一块图像区域涂成一个特定点的颜色值。Canny细节保留非常完整,但这个优点有时候却成为识别的瓶颈,使识别目标不够突出。

应对这些问题,我看了些相关文献,实现了形态学的边缘检测方法。

常用的边缘检测算子:

⒈Sobel算子

2.Robert算子

 3.Prewit算子 

4.Laplace算子

5.Canny算子

形态学边缘检测方法:

实现代码:

 1 private void morphological(Image<Gray, Byte> src, float theta)
 2         {
 3             int[,] mask1 = {{1,2,1},{2,8,2},{1,2,1}};
 4             int[,] mask2 = {{0,1,0},{1,1,1},{0,1,0}};
 5             int[,] mask3 = {{1,0,1},{0,1,0},{1,0,1}};
 6
 7             StructuringElementEx ele1 = new StructuringElementEx(mask1, 1, 1);
 8             StructuringElementEx ele2 = new StructuringElementEx(mask2, 1, 1);
 9             StructuringElementEx ele3 = new StructuringElementEx(mask3, 1, 1);
10
11             Image<Gray, Byte> dst1 = new Image<Gray, Byte>(src.Size);   //先腐蚀再膨胀
12             Image<Gray, Byte> dst2 = new Image<Gray, Byte>(src.Size); //先膨胀再腐蚀
13             CvInvoke.cvErode(src, dst1, ele1, 1);
14             CvInvoke.cvDilate(dst1, dst1, ele2, 1);
15             CvInvoke.cvDilate(src, dst2, ele1, 1);
16             CvInvoke.cvErode(dst2, dst2, ele2, 1);
17
18             Image<Gray, Byte> G12 = new Image<Gray, byte>(src.Size);
19             Image<Gray, Byte> G22 = new Image<Gray, byte>(src.Size);
20             Image<Gray, Byte> G32 = new Image<Gray, byte>(src.Size);
21             Image<Gray, Byte> G1 = new Image<Gray, byte>(src.Size);
22             Image<Gray, Byte> G2 = new Image<Gray, byte>(src.Size);
23             Image<Gray, Byte> G3 = new Image<Gray, byte>(src.Size);
24
25             //G1 = imdilate(imdilate(imerode(f, b1), b2),b3) - imclose(imdilate(imerode(f, b1), b2), b3);
26             CvInvoke.cvDilate(dst1, G1, ele3, 1);
27             CvInvoke.cvMorphologyEx(dst1, G12,new IntPtr(), ele3, Emgu.CV.CvEnum.CV_MORPH_OP.CV_MOP_CLOSE, 1);
28             G1 = G1 - G12;
29
30             //G2 = imopen(imerode(imdilate(f, b1), b2),b3) - imerode(imerode(imdilate(f, b1), b2),b3);
31             CvInvoke.cvMorphologyEx(dst2, G2, new IntPtr(), ele3, Emgu.CV.CvEnum.CV_MORPH_OP.CV_MOP_OPEN, 1);
32             CvInvoke.cvErode(dst2, G22, ele3, 1);
33             G2 = G2 - G22;
34
35             //G3 = imdilate(imdilate(imerode(f, b1), b2),b3) - imerode(imerode(imdilate(f, b1), b2),b3);
36             CvInvoke.cvDilate(dst1, G3, ele3, 1);
37             CvInvoke.cvErode(dst2, G32, ele3, 1);
38             G3 = G3 - G32;
39             //matsub(G3, G32, G3);
40
41             // Gmin = min(G1, G2);
42             // Gmax = max(G1, G2);
43             Image<Gray, Byte> Gmin = new Image<Gray, byte>(src.Size);
44             Image<Gray, Byte> Gmax = new Image<Gray, byte>(src.Size);
45             Gmin = G1.Min(G2);
46             Gmax = G1.Max(G2);
47             /*
48             int row = 0,col = 0;
49             for (; row < Gmin.Rows; row++)
50             {
51                 for (; col < Gmin.Cols; col++)
52                 {
53                     Gmin.Data[row, col, 0] = Math.Min(G1.Data[row, col, 0], G2.Data[row, col, 0]);
54                     Gmax.Data[row, col, 0] = Math.Max(G1.Data[row, col, 0], G2.Data[row, col, 0]);
55                 }
56             }*/
57
58             Gmax = Gmax - Gmin;
59             //matsub(Gmax, Gmin, Gmax);
60             // G = G3 + theta*deltaG;
61             src = G3 + theta * Gmax;
62             /*
63             for (row = 0; row < src.Rows; row++)
64             {
65                 for (col = 0; col < src.Cols; col++)
66                 {
67                     src.Data[row, col, 0] = (byte)(G3.Data[row, col, 0] + theta * Gmax.Data[row, col, 0]);
68                 }
69             }
70             imageBox1.Image = src;*/
71
72         }

实现效果:

形态学边缘检测

时间: 2024-10-24 00:40:19

形态学边缘检测方法的相关文章

Qt 3D的研究(九):尝试另外一种边缘检测方法

Qt 3D的研究(九):尝试另外一种边缘检测方法 三维应用程序,通过FBO,将3D图像渲染成纹理,然后对渲染成的纹理进行图像处理,最终显示在屏幕上的,是风格化后的图案.上一次我使用了一种普通的图像处理方法:索贝尔边缘检测法,与我们的卡通渲染结合起来,实现了这样的效果,接着,我将采用另外一种边缘检测方法--普雷维特(Prewitt)边缘检测方法来重新渲染图案. 蒋彩阳原创文章,首发地址:http://blog.csdn.net/gamesdev/article/details/44405219.欢

unity3d shader之Roberts,Sobel,Canny 三种边缘检测方法

方法其实都差不多,就是用两个过滤器,分别处理两个分量 Sobel算子 先说Sobel算子 GX为水平过滤器,GY为垂直过滤器,垂直过滤器就是水平过滤器旋转90度.过滤器为3x3的矩阵,将与图像作平面卷积.如果不存在边则两个点颜色很接近,过滤器返回一个较小的值,否则就可判断出边缘的存在.当前点为中间点 具体计算如下: 求出图像的每一个像素的横向及纵向灰度值通过以下公式结合,来计算该点灰度的大小  本shdaer将G值作为颜色输出 Roberts算子 Roberts算子与之相似过滤器是2x2的矩阵过

【边缘检测方法】

一.Sobel 二.Prewitt   三.Roberts   四.LoG(Laplacian of a Gaussian)     五.Canny 六.差分边缘检测 原文地址:https://www.cnblogs.com/EstherLjy/p/9347919.html

利用颜色和形态学两种方法进行车牌区域提取的OpenCV代码

要想提取车牌号,首先你要定位车牌区域嘛,本文分别两种方法用,即颜色和形态学的方法,对车牌区域进行判定.说得是两种方法,其实两种方法并无多大的区别,只是有一步的判断标准不一样而已,你看了下面整理出的的思路就知道两者的区别真的很小了. 方法一:利用颜色提取车牌区域的思路: ①求得原图像的sobel边缘sobelMat ②在HSV空间内利用车牌颜色阈值对图像进行二值化处理,得到图像bw_blue→ ③由下面的判别标准得到图像bw_blue_edge for (int k = 1; k != heigh

亚像素边缘检测评述

转载请注明出处:http://blog.csdn.net/lsh_2013 1 引言 数字图像的边缘检测是图像分割.目标识别.区域形状提取等图像处理领域的重要基础.在进行图像理解和分析时,第一步往往是边缘检测.目前边缘检测已经成为机器视觉领域最活跃的课题之一,其研究具有非常重要的理论意义和实际应用价值.传统的边缘检测方法的检测精度最高只能达到一个像素级,但是,随着科学技术的飞速发展,工业检测等应用对精确度的要求不断提高,传统的像素级边缘检测方法已经不能满足实际测量的需要,本文重点介绍的亚像素边缘

【数字图像处理】帧差法与Kirsch边缘检测实现运动目标识别与分割

本文链接:https://blog.csdn.net/qq_18234121/article/details/82763385 作者:冻人的蓝鲸梁思成 视频分割算法可以从时域和空域两个角度考虑.时域分割算法利用视频流时域连续性,通过 相邻帧的时域变化来检测运动目标.在摄像头静止的情况下,常用的方法有帧差法和减背景法. 帧差法比较直观实用,对光照的变化干扰不敏感,但是 对目标的检测不准确,对于缓慢运动的目标甚至可 能无法提取出目标边界,对于快速运动的目标提取 出的目标区域又过大.减背景法容易得到目

Canny边缘检测算法原理及其VC实现详解(二)

转自:http://blog.csdn.net/likezhaobin/article/details/6892629 3.  Canny算法的实现流程 由于本文主要目的在于学习和实现算法,而对于图像读取.视频获取等内容不进行阐述.因此选用OpenCV算法库作为其他功能的实现途径(关于OpenCV的使用,作者将另文表述).首先展现本文将要处理的彩色图片. 图2 待处理的图像 3.1 图像读取和灰度化 编程时采用上文所描述的第二种方法来实现图像的灰度化.其中ptr数组中保存的灰度化后的图像数据.具

Canny边缘检测算法原理及C语言实现详解(原创码字)

Canny算子是John Canny在1986年提出的,那年老大爷才28岁,该文章发表在PAMI顶级期刊上的(1986. A computational approach to edge detection. IEEE Transactions on Pattern Analysis and Machine Intelligence, vol. 8, 1986, pp. 679-698).老大爷目前在加州伯克利做machine learning,80-90年代视觉都是图像处理,现在做视觉都是机器

图像处理之Canny边缘检测

http://blog.csdn.net/jia20003/article/details/41173767 图像处理之Canny 边缘检测 一:历史 Canny边缘检测算法是1986年有John F. Canny开发出来一种基于图像梯度计算的边缘 检测算法,同时Canny本人对计算图像边缘提取学科的发展也是做出了很多的贡献.尽 管至今已经许多年过去,但是该算法仍然是图像边缘检测方法经典算法之一. 二:Canny边缘检测算法 经典的Canny边缘检测算法通常都是从高斯模糊开始,到基于双阈值实现边