欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 房产 > 家装 > EmguCV学习笔记 VB.Net 2.4 Image类

EmguCV学习笔记 VB.Net 2.4 Image类

2024/11/30 13:26:31 来源:https://blog.csdn.net/UruseiBest/article/details/141179738  浏览:    关键词:EmguCV学习笔记 VB.Net 2.4 Image类

 版权声明:本文为博主原创文章,转载请在显著位置标明本文出处以及作者网名,未经作者允许不得用于商业目的。

EmguCV学习笔记目录 Vb.net

EmguCV学习笔记目录 C#

笔者的博客网址:VB.Net-CSDN博客

教程相关说明以及如何获得pdf教程和代码(博客上的教程内容会和pdf教程一致,教程中也会包含所有代码),请移步:EmguCV学习笔记

2.4 Image类

Image类在EmguCV中实际是Image(Of TColor,Tdepth)类,本教程中简称Image类。其中:

  1. Tcolor:图像像素使用的颜色空间,可以使用Bgr、Hsv等。(关于颜色空间的介绍请参看2.1.1节《颜色空间》)
  2. Tdepth:图像深度,即像素的位数。例如:Byte、Int16、Int32等,大多数情况都是使用的Byte。

Image类是EmguCV中最基本的图像类,提供了各种图像处理方法,如图像裁剪、缩放、旋转等。

常用属性:

  1. Mat:对应的Mat矩阵。
  2. ROI:即region of interest(感兴趣的区域),后面会讲用法,如果需要清空ROI, 那么将它设置为Rectangle.Empty。
  3. IsROISet:返回是否设置了ROI。
  4. NumberOfChannels:图像包含的通道数。

2.4.1 构造函数

Image类常用构造函数:

Public Sub New (fileName As String)

实际使用时候的声明如:

Dim img As New Image(Of Bgr, Byte)("C:\learnEmgucv\lena.jpg")

参数:

  1. fileName: 文件路径。

注意:由于使用的是Bgr,表示三个通道数据,每个通道的大小是1个Byte,也就是保存数据从0-255。如果是Image (Of Gray, Byte),那么就只有一个通道。

【代码位置:frmChapter2_3】Button1_Click

以下代码演示了使用不同的颜色空间,显示出来的图像:

    '构造函数

    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click

        '使用Bgr颜色空间

        Dim img1 As New Image(Of Bgr, Byte)("C:\learnEmgucv\lena.jpg")

        ImageBox1.Image = img1

        '使用Hsv颜色空间

        Dim img2 As New Image(Of Hsv, Byte)("C:\learnEmgucv\lena.jpg")

        ImageBox2.Image = img2

End Sub

运行后如下图所示:

图2-55 不同颜色空间显示出的图片

在下面的代码中用到这两个构造函数:

Public Sub New(size As System.Drawing.Size)

Public Sub New(width As Integer, height As Integer, value As TColor)

【代码位置:frmChapter2_3】Button2_Click

    '构造函数

    Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click

        Dim img1 As New Image(Of Bgr, Byte)(New Size(200, 200))

        ImageBox1.Image = img1

        Dim img2 As New Image(Of Bgr, Byte)(img1.Size.Width, img1.Size.Height, New Bgr(255, 0, 0))

        ImageBox2.Image = img2

End Sub

上述代码中,img1设置为了200*200大小,由于没有值,那么默认是0,也就显示为黑色。而img2同img1的宽度和高度,并直接设置颜色为蓝色。

运行后如下图所示:

 

图2-56 显示黑色和蓝色图像

2.4.2 设置图像颜色

通过SetZero和SetValue可以设置图像整体颜色。其中SetZero将图像所有像素设置为0,即黑色;SetValue可以设置指定的颜色。

【代码位置:frmChapter2_3】Button3_Click

    'SetZeroSetValue

    Private Sub Button3_Click(sender As Object, e As EventArgs) Handles Button3.Click

        Dim img1 As New Image(Of Bgr, Byte)(New Size(200, 200))

        '所有像素设置为0

        img1.SetZero()

        ImageBox1.Image = img1

        Dim img2 As New Image(Of Bgr, Byte)(New Size(200, 200))

        '所有像素设置为红色

        img2.SetValue(New Bgr(0, 0, 255))

        ImageBox2.Image = img2

End Sub

运行后如下图所示:

 

图2-57 显示黑色和红色图像

另外还可以通过像素点在行、列方向索引的方式,设置具体某个像素点颜色。需要注意的是,这个方法使用的颜色,和Image的Tcolor要一致。

【代码位置:frmChapter2_3】Button4_Click

    '设置像素点颜色

    Private Sub Button4_Click(sender As Object, e As EventArgs) Handles Button4.Click

        '使用Bgr颜色空间

        Dim img As New Image(Of Bgr, Byte)("C:\learnEmgucv\lena.jpg")

        ImageBox1.Image = img

        For i As Integer = 100 To 200

            For j As Integer = 200 To 300

                'img(,列)=Bgr

                img(j, i) = New Bgr(122, 122, 122)

            Next

        Next

        ImageBox2.Image = img

End Sub

运行后如下图所示:

图2-58 在图像上生成一个灰色的方框

与设置像素点颜色相反,读取图片某个位置像素的颜色可以使用以下代码:

Bgr=img(行,列)

【代码位置:frmChapter2_3】Button5_Click

    '读取像素颜色

    Private Sub Button5_Click(sender As Object, e As EventArgs) Handles Button5.Click

        Dim img As New Image(Of Bgr, Byte)("C:\learnEmgucv\lena.jpg")

        ImageBox1.Image = img

        Dim imgDst As New Image(Of Bgr, Byte)(New Size(120, 120))

        Dim c As Bgr

        '读取源图像坐标(00)像素的颜色

        c = img(0, 0)

        '设置图像颜色

        imgDst.SetValue(c)

        ImageBox2.Image = imgDst

End Sub

运行后如下图所示:

 

图2-59 获取源图像某个像素的颜色

2.4.3 图像的副本

Image 类中的 Copy 和 Clone 方法都可以用于创建图像的副本,但它们之间存在一些区别:如果源图像设置了ROI区域,Clone 方法会将源图像完全复制,包括ROI区域;而Copy方法仅复制源图像的ROI区域。

【代码位置:frmChapter2_3】Button6_Click

    'CopyClone:未设置ROI

    Private Sub Button5_Click(sender As Object, e As EventArgs) Handles Button5.Click

        Dim img As New Image(Of Bgr, Byte)("C:\learnEmgucv\lena.jpg")

        Dim imgClone As Image(Of Bgr, Byte)

        imgClone = img.Clone

        ImageBox1.Image = imgClone

        Dim imgCopy As Image(Of Bgr, Byte)

        imgCopy = img.Copy

        ImageBox2.Image = imgCopy

End Sub

运行后如下图所示:

图2-60 未设置ROI时,Clone和Copy显示相同

【代码位置:frmChapter2_3】Button7_Click

    'CopyClone:设置ROI

    Private Sub Button6_Click(sender As Object, e As EventArgs) Handles Button6.Click

        Dim img As New Image(Of Bgr, Byte)("C:\learnEmgucv\lena.jpg")

        img.ROI = New Rectangle(100, 100, 200, 200)

        Dim imgClone As Image(Of Bgr, Byte)

        imgClone = img.Clone

        '取消ROI区域

        imgClone.ROI = Rectangle.Empty

        '实际显示了源图像的全部区域

        ImageBox1.Image = imgClone

        Dim imgCopy As Image(Of Bgr, Byte)

        imgCopy = img.Copy

        '取消ROI区域,不影响已经拷贝的副本

        img.ROI = Rectangle.Empty

        '实际只显示了源图像的(100, 100, 200, 200)区域

        ImageBox2.Image = imgCopy

End Sub

运行后如下图所示:

 

图2-61 设置ROI后,Clone显示同源图,Copy只显示源图的ROI部分

2.4.4 图像的运算

2.4.4.1 加法

Image类提供了Add和AddWeighted方法,用于对两个图像进行加法运算。这两个方法的作用类似,都是将两个图像的像素值相加,并将结果存储到一个新的图像中。不同之处在于,AddWeighted方法还可以对两个图像进行加权求和,并可以指定权重系数。

需要注意的是,要使用Add和AddWeighted方法对两个图像进行加法运算,两个输入图像的大小、颜色空间和深度类型必须相同。

【代码位置:frmChapter2_3】Button8_Click

    '加法:Add

    Private Sub Button8_Click(sender As Object, e As EventArgs) Handles Button8.Click

        Dim imgsrc As New Image(Of Bgr, Byte)("C:\learnEmgucv\lena.jpg")

        '直接加上某个颜色

        Dim img1 As New Image(Of Bgr, Byte)(imgsrc.Size)

        img1 = imgsrc.Add(New Bgr(40, 40, 40))

        ImageBox1.Image = img1

        '图像+图像

        Dim img2 As New Image(Of Bgr, Byte)(imgsrc.Size)

        img2.SetValue(New Bgr(255, 0, 0))

        For i As Integer = 100 To 200

            For j As Integer = 200 To 300

                img2(j, i) = New Bgr(122, 122, 122)

            Next

        Next

        Dim img3 As New Image(Of Bgr, Byte)(imgsrc.Size)

        'Add

        img3 = imgsrc.Add(img2)

        ImageBox2.Image = img3

End Sub

运行后如下图所示:

 

图2-62 Add方法

AddWeighted方法的语法如下:

Public Function AddWeighted(img2 As Emgu.CV.Image(Of TColor, TDepth), alpha As Double, beta As Double, gamma As Double) As Emgu.CV.Image(Of TColor, TDepth)

其中:

  1. img2:需要做加运算的第二个输入图像。
  2. alpha:第一个输入图像的权重系数。
  3. beta:第二个输入图像的权重系数。
  4. gamma:表示加权求和后的偏移量。

使用AddWeighted方法后:

输出图像像素颜色=第一个输入图像像素颜色* alpha +第二个输入图像像素颜色* beta + gamma

【代码位置:frmChapter2_3】Button9_Click

    'AddWeighted

    Private Sub Button9_Click(sender As Object, e As EventArgs) Handles Button9.Click

        Dim img1 As New Image(Of Bgr, Byte)("C:\learnEmgucv\lena.jpg")

        ImageBox1.Image = img1

        '叠加的图片必须同一个尺寸和同一类型

        Dim img2 As New Image(Of Bgr, Byte)("C:\learnEmgucv\lena_fillwhite.jpg")

        'img1的权重

        Dim alpha As Double = 0.3

        'img2的权重

        Dim beta As Double = 0.5

        '偏移量

        Dim gamma As Double = -40

        Dim img3 As New Image(Of Bgr, Byte)(img1.Size)

        'AddWeighted

        img3 = img1.AddWeighted(img2, alpha, beta, gamma)

        ImageBox2.Image = img3

End Sub

运行后如下图所示:

 

图2-63 AddWeighted方法

2.4.4.2 减法

【代码位置:frmChapter2_3】Button10_Click

    '减法:AbsDiff 1

    Private Sub Button10_Click(sender As Object, e As EventArgs) Handles Button10.Click

        Dim imgsrc As New Image(Of Bgr, Byte)("C:\learnEmgucv\lena.jpg")

        '====以下代码减去某个颜色值

        Dim img1 As Image(Of Bgr, Byte)

        img1 = imgsrc.AbsDiff(New Bgr(50, 50, 50))

        ImageBox1.Image = img1

        '====逆反(底片)效果

        Dim img2 As New Image(Of Bgr, Byte)(imgsrc.Size)

        img2.SetValue(New Bgr(255, 255, 255))

        Dim img3 As Image(Of Bgr, Byte)

        img3 = imgsrc.AbsDiff(img2)

        ImageBox2.Image = img3

End Sub

运行后如下图所示:

 

图2-64 AbsDiff方法

【代码位置:frmChapter2_3】Button11_Click

    '减法:AbsDiff 2 扣出人像

    Private Sub Button11_Click(sender As Object, e As EventArgs) Handles Button11.Click

        Dim imgsrc As New Image(Of Bgr, Byte)("C:\learnEmgucv\lena.jpg")

        ImageBox1.Image = imgsrc

        '载入的图片已经将人像部分涂黑

        Dim img1 As New Image(Of Bgr, Byte)("C:\learnEmgucv\lena_fillblack.jpg")

        Dim img2 As Image(Of Bgr, Byte)

        img2 = imgsrc.AbsDiff(img1)

        '更换图片顺序做减法也一样:

        'img2 = img1.AbsDiff(imgsrc)

        ImageBox2.Image = img2

End Sub

运行后如下图所示:

 

图2-65 使用AbsDiff进行抠图

2.4.4.3 乘法

【代码位置:frmChapter2_3】Button12_Click

    '乘法:Mul

    Private Sub Button12_Click(sender As Object, e As EventArgs) Handles Button12.Click

        Dim img As New Image(Of Bgr, Byte)("C:\learnEmgucv\lena.jpg")

        ImageBox1.Image = img

        Dim img2 As New Image(Of Bgr, Byte)(img.Size)

        img2 = img.Mul(2)

        ImageBox2.Image = img2

End Sub

运行后如下图所示:

 

图2-66 乘法

2.4.4.4 Xor和And运算

【代码位置:frmChapter2_3】Button13_Click

    'XorAnd运算1:使用彩色图片

    Private Sub Button13_Click(sender As Object, e As EventArgs) Handles Button13.Click

        Dim imgsrc1 As New Image(Of Bgr, Byte)("C:\learnEmgucv\lena.jpg")

        Dim imgsrc2 As New Image(Of Bgr, Byte)("C:\learnEmgucv\lena_fillblack.jpg")

        Dim imgout1 As New Image(Of Bgr, Byte)(imgsrc1.Size)

        'Xor运算

        imgout1 = imgsrc1.Xor(imgsrc2)

        ImageBox1.Image = imgout1

        Dim imgout2 As New Image(Of Bgr, Byte)(imgsrc1.Size)

        'And运算

        imgout2 = imgsrc1.And(imgsrc2)

        ImageBox2.Image = imgout2

End Sub

运行后如下图所示:

 

图2-67 彩色图片的Xor和And运算

【代码位置:frmChapter2_3】Button14_Click

    'XorAnd运算2:使用灰度图片

    Private Sub Button14_Click(sender As Object, e As EventArgs) Handles Button14.Click

        Dim imgsrc1 As New Image(Of Gray, Byte)("C:\learnEmgucv\lena.jpg")

        Dim imgsrc2 As New Image(Of Gray, Byte)("C:\learnEmgucv\lena_fillblack.jpg")

        Dim imgout1 As New Image(Of Gray, Byte)(imgsrc1.Size)

        imgout1 = imgsrc1.Xor(imgsrc2)

        ImageBox1.Image = imgout1

        Dim imgout2 As New Image(Of Gray, Byte)(imgsrc1.Size)

        imgout2 = imgsrc1.And(imgsrc2)

        ImageBox2.Image = imgout2

End Sub

运行后如下图所示:

 

图2-68 灰度图片的Xor和And运算

2.4.5 常用方法

Image类提供的图像处理方法和Mat类的方法类似,请参看5.3节【Mat类】部分;此外,还有一些方法和后面第5章【图像处理】所讲述的方法类似,请参考第5章的讲解。

2.4.5.1 Convert

Convert方法将一个图像转换为其他颜色空间的图像,例如将BGR图像转换为灰度图像、将灰度图像转换为彩色图像等。

【代码位置:frmChapter2_3】Button15_Click

    '颜色空间转换

    Private Sub Button15_Click(sender As Object, e As EventArgs) Handles Button15.Click

        Dim img As New Image(Of Bgr, Byte)("C:\learnEmgucv\lena.jpg")

        Dim img1 As Image(Of Rgb, Byte)

        'BgrRgb

        img1 = img.Convert(Of Rgb, Byte)

        ImageBox1.Image = img1

        Dim img2 As Image(Of Gray, Byte)

        'BgrGray

        img2 = img.Convert(Of Gray, Byte)

        ImageBox2.Image = img2

End Sub

运行后如下图所示:

 

图2-69 图像颜色空间转换

2.4.5.2 ThresholdBinary

Thresholdbinary方法,用于对图像进行二值化处理。二值化是一种常用的图像处理技术,可以将图像中的像素点转换为只有两种值(一般是黑和白,对应像素值为0和255)的形式,以便于后续处理。

thresholdbinary方法的语法如下:

Public Function ThresholdBinary(threshold As TColor, maxValue As TColor) As Emgu.CV.Image(Of TColor, TDepth)

参数说明:

threshold:表示阈值,此参数决定了二值化的结果,如果像素点的灰度值大于等于阈值,则将其设为最大值,否则将其设为0。如果是处理多通道图像,那么图像的每个通道将分别与阈值做对比。

maxVal:表示最大值,默认为255。

【代码位置:frmChapter2_3】Button16_Click

    '二值化1ThresholdBinary

    Private Sub Button16_Click(sender As Object, e As EventArgs) Handles Button16.Click

        Dim img As New Image(Of Bgr, Byte)("C:\learnEmgucv\lena.jpg")

        ImageBox1.Image = img

        Dim img2 As New Image(Of Bgr, Byte)(img.Size)

        img2 = img.ThresholdBinary(New Bgr(120, 120, 120), New Bgr(255, 255, 255))

        ImageBox2.Image = img2

End Sub

运行后如下图所示:

 

图2-70 彩色图像二值化

2.4.5.2 ThresholdBinaryInv

ThresholdBinaryInv与Thresholdbinary相反,如果像素点的灰度值小于阈值,则将其设为最大值,否则将其设为0。如果是处理多通道图像,那么图像的每个通道将分别与阈值做对比。

【代码位置:frmChapter2_3】Button17_Click

    '二值化2ThresholdBinaryInv

    Private Sub Button17_Click(sender As Object, e As EventArgs) Handles Button17.Click

        Dim imgsrc As New Image(Of Gray, Byte)("C:\learnEmgucv\lena.jpg")

        Dim img1 As New Image(Of Gray, Byte)(imgsrc.Size)

        img1 = imgsrc.ThresholdBinary(New Gray(120), New Gray(255))

        ImageBox1.Image = img1

        Dim img2 As New Image(Of Gray, Byte)(imgsrc.Size)

        img2 = imgsrc.ThresholdBinaryInv(New Gray(120), New Gray(255))

        ImageBox2.Image = img2

End Sub

运行后如下图所示,可以看到两个图像黑白是相反的:

 

图2-71 ThresholdBinaryInv与Thresholdbinary的对比

Image类下面还有几个Threshold~方法,这里不再累述,后面第5章,还要讲到。

2.4.5.3 Canny

Canny方法用于进行Canny边缘检测。Canny边缘检测是一种非常常用的图像处理算法,它可以检测出图像中的边缘,并将它们以二值图像的形式输出。

Canny方法原型如下:

Public Function Canny(thresh As Double, threshLinking As Double) As Emgu.CV.Image(Of Emgu.CV.Structure.Gray, Byte)

  1. thresh:一个Double类型的值,表示高阈值。
  2. threshLinking:一个Double类型的值,表示低阈值。

【代码位置:frmChapter2_3】Button18_Click

    '边缘检测:canny

    Private Sub Button18_Click(sender As Object, e As EventArgs) Handles Button18.Click

        '载入彩色图像再进行Canny

        Dim imgsrc1 As New Image(Of Bgr, Byte)("C:\learnEmgucv\lena.jpg")

        Dim img1 As New Image(Of Gray, Byte)(imgsrc1.Size)

        img1 = imgsrc1.Canny(120, 0)

        ImageBox1.Image = img1

        '载入灰度图像再进行Canny

        Dim imgsrc2 As New Image(Of Gray, Byte)("C:\learnEmgucv\lena.jpg")

        Dim img2 As New Image(Of Gray, Byte)(imgsrc2.Size)

        img2 = imgsrc2.Canny(120, 0)

        ImageBox2.Image = img2

End Sub

运行后如下图所示,可以看到两种方式进行边缘检测结果不同:

 

图2-72 彩色图像和灰度图像的边缘检测

2.4.5.4 SmoothBlur

SmoothBlur方法用于对图像进行模糊(也称为滤波)处理,以达到平滑图像的效果。模糊处理是一种常见的图像预处理方法,可以减少图像中的噪声,平滑图像的边缘和细节,同时也可以用于去除图像中的某些细节信息,以达到特定的目的。

SmoothBlur方法的原型为:

Public Function SmoothBlur(width As Integer, height As Integer) As Emgu.CV.Image(Of TColor, TDepth)

SmoothBlur方法将按照像素对width*height的区域进行求和,随后乘上1/(width*height)获得处理后的像素值。

【代码位置:frmChapter2_3】Button19_Click

    '模糊:SmoothBlur

    Private Sub Button19_Click(sender As Object, e As EventArgs) Handles Button19.Click

        Dim img As New Image(Of Bgr, Byte)("C:\learnEmgucv\lena.jpg")

        ImageBox1.Image = img

        Dim img2 As New Image(Of Bgr, Byte)(img.Size)

        img2 = img.SmoothBlur(3, 10)

        ImageBox2.Image = img2

End Sub

运行后如下图所示:

 

图2-73 模糊

2.4.5.5 SmoothGaussian

Smoothgaussian方法用于对图像进行高斯模糊(滤波),可以用于去噪或者平滑图像。高斯滤波是一种线性平滑滤波器,它可以对图像进行平滑处理,同时保持图像的边缘信息不变。

Smoothgaussian方法的原型为:

Public Function SmoothGaussian(kernelWidth As Integer, kernelHeight As Integer, sigma1 As Double, sigma2 As Double) As Emgu.CV.Image(Of TColor, TDepth)

  1. kernelWidth和kernelHeight表示模糊核的宽度和高度,也称为模板的大小。
  2. sigmaX和sigmaY分别表示模糊核在X和Y方向上的标准差,决定了模糊程度。

【代码位置:frmChapter2_3】Button20_Click

    '模糊:SmoothGaussian

    Private Sub Button20_Click(sender As Object, e As EventArgs) Handles Button20.Click

        Dim img As New Image(Of Bgr, Byte)("C:\learnEmgucv\lena.jpg")

        ImageBox1.Image = img

        Dim img2 As New Image(Of Bgr, Byte)(img.Size)

        img2 = img.SmoothGaussian(5, 5, 15, 1.5)

        ImageBox2.Image = img2

End Sub

运行后如下图所示:

图2-74 高斯模糊

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com