网站定制一般价格多少,php网站备份,企业软件下载,临沂网站建设公司全国版权声明#xff1a;本文为博主原创文章#xff0c;转载请在显著位置标明本文出处以及作者网名#xff0c;未经作者允许不得用于商业目的。 教程VB.net版本请访问#xff1a;EmguCV学习笔记 VB.Net 目录-CSDN博客
教程C#版本请访问#xff1a;EmguCV学习笔记 C# 目录-CSD… 版权声明本文为博主原创文章转载请在显著位置标明本文出处以及作者网名未经作者允许不得用于商业目的。 教程VB.net版本请访问EmguCV学习笔记 VB.Net 目录-CSDN博客
教程C#版本请访问EmguCV学习笔记 C# 目录-CSDN博客
笔者的博客网址https://blog.csdn.net/uruseibest
教程配套文件及相关说明以及如何获得pdf教程和代码请移步EmguCV学习笔记
学习VB.Net知识请移步 https://blog.csdn.net/uruseibest/article/details/69663231 学习C#知识请移步https://blog.csdn.net/uruseibest/article/details/136127499 4.5 像素距离和连通区域
4.5.1 DistanceTransform 像素距离
在VB.NET中使用EmguCV可以通过CvInvoke.DistanceTransform函数进行距离变换操作。
Public Shared Sub DistanceTransform(src As Emgu.CV.IInputArray, dst As Emgu.CV.IOutputArray, labels As Emgu.CV.IOutputArray, distanceType As Emgu.CV.CvEnum.DistType, maskSize As Integer, Optional labelType As Emgu.CV.CvEnum.DistLabelType 0)
参数说明
src输入图像类型为单通道CV8U的Mat。dst输出图像类型为CV8U或者CV32F的Mat。与输入图像具有相同的尺寸和类型用于存储距离变换结果它的每个像素的值表示该像素与0像素的最小距离。labels输出图像类型为CV32S的Mat。用于存储每个前景像素所属的连通域标签。distanceType指定计算距离所使用的度量类型类型为DistanceType主要成员包括 L1曼哈顿距离也称为城市街区距离表示两点之间在水平和垂直方向上的距离之和。L2欧几里得距离表示两点之间的直线距离即两点之间的最短距离。CChebyshev距离表示两点之间在水平、垂直和对角线方向上的最大距离。maskSize指定掩膜大小即要使用的邻域尺寸常见的有3、5、7等3表示3x3的掩膜5表示5x5的掩膜以此类推。labelType指定计算连通域标签所使用的算法类型可选值为DistLabelType.CComp或DistLabelType.Pixel。 【代码位置frmChapter4】Button18_Click、printMatSingle DistanceTransform Private Sub Button18_Click(sender As Object, e As EventArgs) Handles Button18.Click Dim bte(,) As Byte bte { {0, 0, 0, 0, 0, 0, 0, 0, 0}, {0, 1, 1, 1, 1, 1, 1, 1, 0}, {0, 1, 1, 1, 1, 1, 1, 1, 0}, {0, 1, 1, 1, 1, 1, 1, 1, 0}, {0, 1, 1, 1, 1, 1, 1, 1, 0}, {0, 1, 1, 1, 1, 1, 1, 1, 0}, {0, 1, 1, 1, 1, 1, 1, 1, 0}, {0, 1, 1, 1, 1, 1, 1, 1, 0}, {0, 0, 0, 0, 0, 0, 0, 0, 0} } Dim matr As New Matrix(Of Byte)(bte) Dim m As New Mat(matr.Size, DepthType.Cv8U, 1) m matr.Mat Dim mdistance As New Mat(m.Size, DepthType.Cv8U, 1) Dim labels1 As New Mat() CvInvoke.DistanceTransform(m, mdistance, labels1, DistType.L2, 3) 如果参数labels使用nothing那么 mdistance 中的元素类型是single CvInvoke.DistanceTransform(m, mdistance, Nothing, DistType.L2, 3) Call printMatSingle(mdistance) End Sub 输出single类型Mat的元素的值 Private Sub printMatSingle(ByVal m As Mat) Dim matr As New Matrix(Of Single)(m.Rows, m.Cols, m.NumberOfChannels) m.CopyTo(matr) For i As Integer 0 To matr.Rows - 1 For j As Integer 0 To matr.Cols - 1 Console.Write(matr(i, j)) If j matr.Cols - 1 Then Console.Write(,) End If Next Console.WriteLine() Next
End Sub
运行后如下图所示 图4-18 像素间距离 4.5.2 connectedComponents 图像连通区域
ConnectedComponents方法是EmguCV中用于实现连通区域分析的函数。在图像处理中经常需要对图像中的连通区域进行分析和处理如区域标记、分割、形状识别等。ConnectedComponents函数可以将图像中的连通区域分析出来并返回每个连通区域的标记和属性信息。声明如下
Public Shared Function ConnectedComponents(image As Emgu.CV.IInputArray, labels As Emgu.CV.IOutputArray, Optional connectivity As Emgu.CV.CvEnum.LineType 8, Optional labelType As Emgu.CV.CvEnum.DepthType 4, Optional cclType As Emgu.CV.CvEnum.ConnectedComponentsAlgorithmsTypes -1) As Integer
参数说明
image输入图像类型为Mat。labels输出一个单通道Mat。连通区域标记的结果将存储在该Mat中。背景一般存储为0相同连通区域的值相同。connectivity连通区域的连接方式类型为LineType。指定连通区域的连接方式常见的有4连通LineType.FourConnected和8连通LineType. Eight Connected。ltypelabels图像的深度类型类型为DepthType。可以选择浮点型DepthType.Cv32F或整型DepthType.Cv32S。ccltype连通区域标签类型类型为ConnectedComponentsAlgorithmsTypes这是一个枚举类型它表示连通区域分析算法的类型。连通区域分析是一种将二值图像中的像素划分为不同连通区域的技术。在EmguCV中提供了多种不同的算法来进行连通区域分析每种算法都有其特点和适用范围。ConnectedComponentsAlgorithmsTypes枚举类型定义了可用的连通区域分析算法类型主要包括 CCL_GRANAGrana算法一种基于扫描线的算法适用于较小的图像。CCL_WUWu算法一种基于扫描线的算法适用于较大的图像。CCL_DEFAULT默认算法使用基于扫描线的算法但会根据图像大小和特征动态选择算法。
返回值
分析出的连通区域的数量。
【代码位置frmChapter4】Button19_Click connectedComponents Private Sub Button19_Click(sender As Object, e As EventArgs) Handles Button19.Click Dim m1 As New Mat(C:\learnEmgucv\shape.jpg, CvEnum.ImreadModes.Grayscale) ImageBox1.Image m1 二值化 Dim mid1 As New Mat CvInvoke.Threshold(m1, mid1, 150, 255, ThresholdType.BinaryInv) 连通区域分析结果存储到result中 Dim result As New Mat Dim num As Integer 获得连通区域 num CvInvoke.ConnectedComponents(mid1, result, LineType.FourConnected, DepthType.Cv16U) Console.WriteLine(连通区域数量: num) 在本代码中使用的图像获得的连通区域为12含背景result中像素的值从0-11 所以这里看到的是全黑色的图 ImageBox2.Image result Dim img As New Image(Of Gray, Byte)(m1.Size) img result.ToImage(Of Gray, Byte) Dim img1 As New Image(Of Bgr, Byte)(m1.Size) Dim maxsize As Integer 0 使用循环遍历分析出的连通区域这里对非背景0的区域着相同颜色 For i As Integer 0 To img.Rows - 1 For j As Integer 0 To img.Cols - 1 0的区域作为背景 If img.Data(i, j, 0) 0 Then img1.Data(i, j, 0) 0 img1.Data(i, j, 1) 0 img1.Data(i, j, 2) 0 Else Console.WriteLine(img.Data(i, j, 0)) maxsize IIf(maxsize img.Data(i, j, 0), maxsize, img.Data(i, j, 0)) img1.Data(i, j, 0) 0 img1.Data(i, j, 1) 255 img1.Data(i, j, 2) 255 End If Next Next ImageBox3.Image img1 为什么差1因为包含了背景部分。 MessageBox.Show(num num maxsize maxsize)
End Sub
运行后如下图所示 图4-19 连通区域 4.5.3 connectedComponentsWithStats
ConnectedComponentsWithStats方法是用于进行连通区域分析的函数它可以分析二值图像中的连通区域并返回每个连通区域的标记值、面积、重心和边界框等信息。声明如下
Public Shared Function ConnectedComponentsWithStats(image As Emgu.CV.IInputArray, labels As Emgu.CV.IOutputArray, stats As Emgu.CV.IOutputArray, centroids As Emgu.CV.IOutputArray, Optional connectivity As Emgu.CV.CvEnum.LineType 8, Optional labelType As Emgu.CV.CvEnum.DepthType 4, Optional cclType As Emgu.CV.CvEnum.ConnectedComponentsAlgorithmsTypes -1) As Integer
参数说明其余参数请参看4.4.2节【connectedComponents 图像连通区域】
stats统计信息类型为Mat。用于存储每个连通区域的统计信息如面积、位置、宽度、高度等。它是一个5列的矩阵 每一行对应一个连通区域分别为连通区域外接矩形的x、y、width、height和面积。centroids质心坐标类型为Mat。用于存储每个连通组件的质心坐标。
【代码位置frmChapter4】Button20_Click 连通区域的统计信息自定义结构 包含x、y、width、height和面积 由于Rectangle已经包含x、y、width、height 所以这里的结构是Rectangle和Integer Public Structure sstats Dim rec As Rectangle Dim area As Integer End Structure 连通区域分析 注意白色255代表有数据黑色0代表没有数据 所以要根据图像实际情况确保图像输入之前转换成黑底白图 Private Sub Button20_Click(sender As Object, e As EventArgs) Handles Button20.Click Dim m1 As New Mat(C:\learnEmgucv\shape.jpg, CvEnum.ImreadModes.Grayscale) ImageBox1.Image m1 二值化 Dim mid1 As New Mat 这里过滤了一部分连通区域 CvInvoke.Threshold(m1, mid1, 150, 255, ThresholdType.BinaryInv) ImageBox2.Image mid1 Dim result As New Mat Dim mstats As New Mat Dim mcentroids As New Mat Dim num As Integer num CvInvoke.ConnectedComponentsWithStats(mid1, result, mstats, mcentroids, LineType.EightConnected, DepthType.Cv16U) Dim stats(num - 1) As sstats 拷贝到sstats数组 mstats.CopyTo(stats) Dim centroids(num - 1) As MCvPoint2D64f 拷贝到点数组 mcentroids.CopyTo(centroids) 载入彩色图像 Dim m2 As New Mat(C:\learnEmgucv\shape.jpg, CvEnum.ImreadModes.AnyColor) 总的面积算下来就是mid1或者result点的数量。 Dim allpoints As Integer 0 For i As Integer 0 To num - 1 画出每个连通区域的中心点 CvInvoke.Circle(m2, New Point(CInt(centroids(i).X), CInt(centroids(i).Y)), 10, New MCvScalar(0, 255, 255), -1) 画出每个连通区域的外接矩形 CvInvoke.Rectangle(m2, stats(i).rec, New MCvScalar(255, 0, 0), 2) 在本例中使用的图像高度486宽度537即总的像素数量486*537260982 这里计算出的面积总的点的数量260982 allpoints stats(i).area Next ImageBox3.Image m2
End Sub
运行后如下图所示 图4-20 绘制连通区域的中心和外接矩形