网站给他人做付刑事责任,网站备案必须是企业吗,wordpress ssl设置,深圳企业500强版权声明#xff1a;本文为博主原创文章#xff0c;转载请在显著位置标明本文出处以及作者网名#xff0c;未经作者允许不得用于商业目的。
本文的C#版本请访问#xff1a;图像分割-Grabcut法(C#)-CSDN博客
GrabCut是一种基于图像分割的技术#xff0c;它可以用于将图像…版权声明本文为博主原创文章转载请在显著位置标明本文出处以及作者网名未经作者允许不得用于商业目的。
本文的C#版本请访问图像分割-Grabcut法(C#)-CSDN博客
GrabCut是一种基于图像分割的技术它可以用于将图像中的前景和背景分离。在实现中GrabCut算法通常需要使用高斯混合模型(GMM)来建立前景和背景的概率分布以便更好的估计像素的标签。同时还需要考虑如何处理边界处的像素以避免边界处的像素被错误地分类。GrabCut算法在图像分割中有着广泛的应用例如人像分割、物体抠图等。
EmguCV使用CvInvoke.GrabCut方法来执行GrabCut算法该方法声明如下
Public Shared Sub GrabCut ( img As IInputArray, mask As IInputOutputArray, rect As Rectangle, bgdModel As IInputOutputArray, fgdModel As IInputOutputArray, iterCount As Integer, type As GrabcutInitType
)
参数说明
img输入输出的图像必须是三通道彩色图像。mask指定的掩码图像必须是单通道灰度图像并且与输入图像具有相同的尺寸。可以传入0-3的值分别为0表示明显为背景的像素、1表示冥相位前景的像素、2表示可能为背景的像素、3表示可能为前景的像素。rect指定的矩形框用于定位大概率可能为前景目标的位置。bgdModel背景模型必须是单通道浮点型Mat。fgdModel前景模型必须是单通道浮点型Mat。iterCount迭代次数用于控制算法的收敛性。typeGrabCut算法初始化类型可以选择GrabCutInitType.WithRect或GrabCutInitType.WithMask分别表示根据提供的矩形初始化或根据掩码初始化。
该方法没有返回值而是直接在mask图像上进行前景分割操作最终获得的mask包含0-3的值含义如参数中说明。 Grabcut法 Private Sub Button5_Click(sender As Object, e As EventArgs) Handles Button5.ClickDim m As New Mat(C:\learnEmgucv\tower.jpg, ImreadModes.AnyColor)Dim result As New MatDim bg As New MatDim fg As New MatDim rect As New Rectangle(80, 30, 680, 450)CvInvoke.GrabCut(m, result, rect, bg, fg, 1, GrabcutInitType.InitWithRect)输出的result只有4个值0确定背景1确定前景2可能背景3可能前景演示框选范围CvInvoke.Rectangle(m, rect, New MCvScalar(255, 255, 255), 1)ImageBox1.Image m标记区域Dim matr As New Matrix(Of Byte)(result.Rows, result.Cols)result.CopyTo(matr)For i As Integer 0 To matr.Cols - 1For j As Integer 0 To matr.Rows - 1将确定背景和可能背景标记为0否则为255If matr(j, i) 0 Or matr(j, i) 2 Thenmatr(j, i) 0Elsematr(j, i) 255End IfNextNextDim midm As New Matmidm matr.Mat显示标记的图像CvInvoke.Imshow(midm, midm)灰度转为彩色Dim midm1 As New MatCvInvoke.CvtColor(midm, midm1, ColorConversion.Gray2Bgr)Dim mout As New MatAnd运算CvInvoke.BitwiseAnd(m, midm1, mout)CvInvoke.Imshow(mout, mout)
End Sub输出结果如下图所示 图8-5 Grabcut法分离前景 Grabcut法 Private Sub Button6_Click(sender As Object, e As EventArgs) Handles Button6.ClickDim m As Mat CvInvoke.Imread(C:\learnEmgucv\tower.jpg, CvEnum.ImreadModes.Color)Dim result As New MatDim bg As New MatDim fg As New MatDim rect As New Rectangle(80, 30, 680, 450)CvInvoke.GrabCut(m, result, rect, bg, fg, 5, CvEnum.GrabcutInitType.InitWithRect)Dim src As Image(Of Bgr, Byte) m.ToImage(Of Bgr, Byte)Dim dst As New Image(Of Bgr, Byte)(New Size(src.Width, src.Height))Dim mask As Image(Of Gray, Byte) result.ToImage(Of Gray, Byte)直接操作Image像素点For i As Integer 0 To src.Rows - 1For j As Integer 0 To src.Cols - 1如果是确定前景和可能前景直接保留原像素点颜色否则为黑色If mask.Data(i, j, 0) 1 Or mask.Data(i, j, 0) 3 Thendst.Data(i, j, 0) src.Data(i, j, 0)dst.Data(i, j, 1) src.Data(i, j, 1)dst.Data(i, j, 2) src.Data(i, j, 2)Elsedst.Data(i, j, 0) 0dst.Data(i, j, 1) 0dst.Data(i, j, 2) 0End IfNextNextImageBox1.Image dst
End Sub输出结果如下图所示 图8-6 Grabcut法分离前景 标记为确定前景这里使用InitWithMask 参数Private Sub Button7_Click(sender As Object, e As EventArgs) Handles Button7.ClickDim m As New Mat(c:\learnEmgucv\lena.jpg, ImreadModes.AnyColor)Dim mask As New MatDim bg As New MatDim fg As New MatDim rect As New Rectangle(80, 30, 340, 480)使用前景为全白色Dim m1 As New Mat(c:\learnEmgucv\lena_fillwhite.jpg, ImreadModes.Grayscale)Dim mask1 As New Mat二值化CvInvoke.Threshold(m1, mask1, 250, 1, ThresholdType.Binary)CvInvoke.Rectangle(m, rect, New MCvScalar(255, 255, 255), 1)标记之后再调用GrabCut使用InitWithMask参数CvInvoke.GrabCut(m, mask1, rect, bg, fg, 2, GrabcutInitType.InitWithMask)Dim matrx As New Matrix(Of Byte)(mask1.Rows, mask1.Cols)mask1.CopyTo(matrx)For i As Integer 0 To matrx.Cols - 1For j As Integer 0 To matrx.Rows - 1If matrx(i, j) 0 Or matrx(i, j) 2 Thenmatrx(i, j) 0Elsematrx(i, j) 255End IfNextNextDim midm2 As New Matmidm2 matrx.MatDim midm1 As New MatCvInvoke.CvtColor(midm2, midm1, ColorConversion.Gray2Bgr)Dim mout As New MatCvInvoke.BitwiseAnd(m, midm1, mout)CvInvoke.Imshow(mout, mout)
End Sub输出结果如下图所示 图8-7 Grabcut法分离前景 由于.net平台下C#和vb.NET很相似本文也可以为C#爱好者提供参考。
学习更多vb.net知识请参看vb.net 教程 目录