您现在的位置是:首页 >技术杂谈 >图像处理&opencv网站首页技术杂谈

图像处理&opencv

陈一一敲代码 2024-06-17 10:19:24
简介图像处理&opencv
                                    **

第三周学习笔记

2.图像处理

2.1图像阈值

2.1.1概念

1.关于图像阈值在基础的OpenCV中主要使用的是cv2.threshold()这个是简单阈值

2.首先我们要了解什么是简单阈值,阈值能够干什么,简单阈值是我们设置的一个临界值,这个临界值的作用就是对应图像的每一个像素值,如果他小于这个临界值,那么就对这个像素点的值设置为0(一种情况),如果大于这个临界值就把他设置为最大值255(一种情况),在使用阈值之后的图像就会只剩下两个颜色像素最大值和最小值(这是图像阈值中的其中一种情况)。

2.1.2图像阈值的语法

图像阈值中的简单阈值cv2.threshold(),其中需要传入4个参数

ret,dst=cv2.threshold(src,thresh,maxval,type)

#对每一个参数的解释
#1.ret是返回值为True和False,代表有没有读取到图片
#2.dst是输出图
#3.src是输入图,只能输入单通道图像,通常来讲是灰度图
#4.thresh是阈值
#5.maxval是最大值,当图像的像素点的值超过了阈值,根据type来决定它所赋予的值
#6.type二值化操作的类型,包含以下五种类型
#6.1cv2.THRESH.BINARY    :超过阈值的部分取maxval,否则取0(也就是超过阈值的像素值去最大值,也就是最亮的点,其他的,取得是黑色)
#6.2cv2.THRESH.BINARY_INV 就是THRESH.BINARY的反转.
#6.3cv2.THRESH.TRUNC()#截断式 大于阈值的部分设为阈值,否则不变。
#6.4cv2.THRESH.TOZERO()#大于阈值的部分不改变,否则设置为0.
#6.5cv2.THRESH.TOZERO_INV()#cv2.THRESH.TOZERO()的反转

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-EVAoG8BD-1684071099495)(C:Users86185Desktop学习笔记图片屏幕截图 2023-05-07 233430.png)]

这里引入了plt中的plt.subplot(),这是matpltlib中的一个十分常见的绘图函数,就是把若干个图像按照行和列的形式排列,这个函数中有三个参数,其中第一个参数是代表的是行,第二个参数代表的是列,第三个参数显示的是这个图片具体在什么地方。

运行结果:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-EvfLE5Oe-1684071099496)(C:Users86185Desktop学习笔记图片屏幕截图 2023-05-07 233537.png)]

2.2图像平滑处理

为什么要学习图像平滑处理,这是因为图像在处理和提取等过程中可能会对图像有着产生噪声,噪声在图像上常表现为一引起较强视觉效果的孤立像素点或像素块。一般,噪声信号与要研究的对象不相关,它以无用的信息形式出现,扰乱图像的可观测信息。通俗的说就是噪声让图像不清楚,所以就对图像进行平滑处理,平滑处理说白了就是对我们的图像像素点的每一个数据进行滤波操作,去掉滤波,这里将的是四种十分基础的滤波操作,均值滤波

2.2.1均值滤波

1.概念介绍

均值滤波是典型的 线性滤波算法,是指用当前像素点周围nxn个像素值的均值来代替当前像素值。使用该方法遍历处理图像内的每一个像素点,可完成整幅图像的均值滤波。

2.基本原理

我们对第5行第5列的像素点进行均值滤波时,首先需要考虑需要对周围多少个像素点去取平均值。通常情况下,我们会以该当前像素为中心,对行数和列数相等的一块区域内的所有像素点的像素取平均值。
 例如,我们可以以当前像素点的像素周围3x3区域内所有像素点的像素取平均值,也可以对周围5x5区域内所有像素点的像素值取平均值。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-fwbZt0Sf-1684071099497)(C:Users86185Desktop学习笔记图片8c7fc9693f0d4921a9af14eca72dce00.png)]

当前像素点的位置为第5行第5列时,我们对其周围5*5区域内的像素值取平均,计算方法如下:
像素点新值=
[(197+25+106+156+159)
(149+40+107+5+71)+
(163+198+226+223+156) +
(222+37+68+193+157)+
(42+72+250+41+75)]/25 = 126

计算得到新值以后,我们将新值作为当前像素点均值滤波后的像素值。我们针对图2-1的每一个像素点计算其周围5x5区域内的像素值均值,并将其作为当前像素点的新值,即可得到当前图像的均值滤波结果。

然而图像的边界并不存在5x5的领域区域。如图2-1的左上角第1行第1列上的像素点,其像素值为23。如果以其为中心点取周围5x5领域,则5x5领域的部分区域位于图像外部。但是图像外部是没有像素点和像素值的,显然是无法计算该点的领域均值的。

因此,针对边缘的像素点,可以只取图像内存在的周围领域点的像素值均值。
计算左上角的均值滤波结果时,仅取图中灰色背景的33领域内的像素值的平均值。计算方法如下:
像素点新值=
[(23+158+140)+
(238+0+67)+
(199+197+25)]/9
=116

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-fd7xGo6Y-1684071099497)(C:Users86185Desktop学习笔记图片2c7be6bf75ad483aac7671e17f5ac309.png)]

针对第5行第5列的像素点,其运算过程相当于一个额内部值是1/25的55矩阵进行相乘运算,从而得到均值滤波的结果为126

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-VWtm3OI0-1684071099498)(C:Users86185Desktop学习笔记图片deb9fee2dd1146b6996850dd11243334.png)]

根据上述运算,针对每一个像素点,都是与一个内部值均为1/25的55举证相乘,得到均值滤波的计算结果

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-s8FI4bLP-1684071099499)(C:Users86185Desktop学习笔记图片52066f2ab65d4b3bbed4b02f36375b90.png)]

将使用到的5x5矩阵一般化

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-RR2iyT38-1684071099500)(C:Users86185Desktop学习笔记图片4459f381858748a29498ff0a9772fa00.png)]

在Opencv中,将上面右侧的矩阵整一个K称为卷积核,其中M和N分别对应高度和宽度,一般情况下M和N的值是相等的,常用的3x3、5x5和7x7。如果M和N的值越大,参与运算的值就越大,参与运算的像素点的数量就越多,图像失真就越严重

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-QFoeLrRW-1684071099500)(C:Users86185Desktop学习笔记图片14bc64416c1a463d93f0e7814e0468de.png)]

3.函数语法

在OpenCV中,实现均值滤波的函数是cv2.blur(),其语法形式为 dst= cv2.blur(src,ksize,anchor,borderType)

#参数解释
#dst:返回值,表示的是进行均值滤波后得到的输出图
#src:输入图,就是需要处理的图像,原始图像。
#ksize:滤波核的大小,指的是在进行均值处理的时候,它的领域图像的高度和宽度,例如5*5表示,是以5行5列作为图像均值处理领域的结果。
#anchor和borderType:在基础阶段,直接使用默认值就好

所以,函数cv2.blur()的一般形式为;dst=cv2.blur(src,ksize)

4代码实现

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Vij9gDNm-1684071099501)(C:Users86185Desktop学习笔记图片屏幕截图 2023-05-08 234417.png)]

运行结果

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-2cPHs6wV-1684071099502)(C:Users86185Desktop学习笔记图片屏幕截图 2023-05-08 234529.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-OtK3kdw3-1684071099503)(C:Users86185Desktop学习笔记图片屏幕截图 2023-05-08 234552.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-JaHcDeHp-1684071099503)(C:Users86185Desktop学习笔记图片屏幕截图 2023-05-08 234616.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-u1rEjYPu-1684071099504)(C:Users86185Desktop学习笔记图片屏幕截图 2023-05-08 234636.png)]

总结:所设置的滤波核越大,则图像降噪越明显。越失真。

2.2.2方框滤波

1.基本原理

与均值滤波不同的是,方框滤波不会计算像素的均值(可以在函数传入参数的时候自己设置要不要计算均值)在均值滤波中,滤波结果的像素值是任意一个点的邻域平均值,等于各邻域像素值之和除以邻域面积。而在方框滤波中,可以自由选择是否对均值滤波的结果进行归一化,即可以自由选择滤波结果是邻域像素值之和的平均值,还是邻域像素值之和

以5×5的邻域为例,在进行方框滤波时,如果计算的是邻域像素值的均值,则滤波关系所上图示;如果计算的是邻域像素值之和,则滤波关系如下图所示:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xhutIexR-1684071099505)(C:Users86185Desktop学习笔记图片cbd93a57af26469883f859989216ff6c.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-QbKJFmND-1684071099506)(C:Users86185Desktop学习笔记图片56521eee679443f1995f6b04d1bf7344.png)]

根据上述关系,如果计算的是领域像素值的均值,那么使用的卷积核是:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xgQaLKRt-1684071099506)(C:Users86185Desktop学习笔记图片f7873a2488e040cc99094d8e1da06320.png)]

如果计算的是领域像素值之和,那么使用的卷积核是:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-GVBRmZcG-1684071099507)(C:Users86185Desktop学习笔记图片6eb98e6af9e4e9881eeb638e30c3de3.png)]

2.函数语法

#在Opencv中,实现方框滤波的函数是cv2.boxFilter(),其语法形式是dst=cv2.boxFilter(src,ddepth,ksize,anchor,normalize,borderType)
#dst是输出图,表示的是经过方框滤波处理后的图像
#src是原始图像,需要被处理的图像
#ddepth:处理后结果图像的深度,一般使用-1表示与原始图像使用相同的图像深度。
#图像深度:图像深度是指像素深度中实际用于存储图像的灰度或色彩所需要的比特位数,彩色图像每个像素用R,G,B三个分量表示,每个分量用8位,像素深度为24位
#ksize:滤波核的大小。滤波核大小是指在滤波处理过程中所选择的邻域图像的高度和宽度
#anchor:锚点,默认值为(-1, -1),表示当前计算均值的点位于核的中心点位置。该值使用默认值即可,在特殊情况下可以指定不同的点作为锚点。
#normalize(归一化):normalize:表示在滤波时是否进行归一化(这里指将计算结果规范化为当前像素值范围内的值)处理,该参数是一个逻辑值,可能为真(值为 1)或假(值为 0)
  #当参数normalize=0时,表示不需要进行归一化处理,直接使用邻域像素值的和。
  #当参数normalize=1时,表示要进行归一化处理,要用邻域像素值的和除以面积

normalize=0时,由于不进行归一化处理,因此滤波得到的值很可能超过当前像素值范围的最大值,从而被截断为最大值(255)

通常情况下,在使用方框滤波函数时,对于参数 anchor、和 borderType,直接采用其默认值即可。因此,函数 cv2.boxFilter()的常用形式为:dst = cv2.boxFilter( src, ddepth, ksize,normalize )

3.代码实现

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Whjhj5XV-1684071099508)(C:Users86185Desktop学习笔记图片屏幕截图 2023-05-09 104117.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Dh6LeAyO-1684071099509)(C:Users86185Desktop学习笔记图片屏幕截图 2023-05-09 104430.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-eiWMshcV-1684071099509)(C:Users86185Desktop学习笔记图片屏幕截图 2023-05-09 104510.png)]

2.2.3高斯滤波

1.概念介绍

高斯滤波是一种线性平滑滤波,适用于消除高斯噪声,广泛应用于图像处理的减噪过程。

通俗的讲,高斯滤波就是对整幅图像进行加权平均的过程,每一个像素点的值,都由其本身和邻域内的其他像素值经过加权平均后得到。

高斯滤波的具体操作是:用一个模板(或称卷积、掩模)扫描图像中的每一个像素,用模板确定的邻域内像素的加权平均灰度值去替代模板中心像素点的值。

对应均值滤波和方框滤波来说,其邻域内每个像素的权重是相等的。而在高斯滤波中,会将中心点的权重值加大,远离中心点的权重值减小,在此基础上计算邻域内各个像素值不同权重的和

2.基本原理

在高斯滤波中,卷积核的值不再是1

针对最左侧的图像内第4行第3列位置上像素值为226的像素点进行高斯卷积,其运算规则为将该领域内的像素点按照不同的权重计算和。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-8JoP9lFN-1684071099510)(C:Users86185Desktop学习笔记图片2d79305520c74a06848bf95f9fd1b401.png)]

针对第 4 行第 3 列位置上的像素值为 226 的像素点进行高斯滤波处理,计算方式为:
新值=(40×0.05+107×0.1+5×0.05)
+(198×0.1+226×0.4+223×0.1)
+(37×0.05+68×0.1+193×0.05)
=164

在实际使用中,高斯滤波使用的可能是不同大小的卷积核。

在高斯滤波中,核的宽度和高度可以不相同,但是它们都必须是奇数

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-oP7KG11P-1684071099511)(C:Users86185Desktop学习笔记图片屏幕截图 2023-05-11 141856.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-1cZnmzC8-1684071099512)(C:Users86185Desktop学习笔记图片屏幕截图 2023-05-11 141934.png)]

在实际计算中,卷积核是归一化处理的,这种处理可以表示为上图最左侧的小数形式的卷积核,也可以表示为下图所示的分数形式。
 也要注意,在一些资料中,给出的卷积核并没有进行归一化,这时的卷积核可能表示为图中间和右侧所示的卷积核,这样的卷积核是为了说明问题用的,实际使用时往往需要进行归一化。严格来讲,使用没有进行归一化处理的卷积核进行滤波,得到的结果往往是错误的。

3.函数语法

在 OpenCV 中,实现高斯滤波的函数是 cv2.GaussianBlur(),该函数的语法格式是:
dst = cv2.GaussianBlur( src, ksize, sigmaX, sigmaY, borderType )

#参数解析:
#dst:返回值,表示进行高斯滤波后得到的处理结果。
#src: 是需要处理的图像,即原始图像。
#ksize: 是滤波核的大小。滤波核大小是指在滤波处理过程中其邻域图像的高度和宽度。需要注意,滤波核的值必须是奇数。
#sigmaX:卷积核在水平方向上(X 轴方向)的标准差,其控制的是权重比例。图中是不同的 sigmaX 决定的卷积核,它们在水平方向上的标准差不同
#sigmaY :卷积核在垂直方向上(Y 轴方向)的标准差。如果将该值设置为 0,则只采用sigmaX 的值;如果 sigmaX 和 sigmaY 都是 0,则通过 ksize.width 和 ksize.height 计算得到。其中:
  #sigmaX = 0.3×[(ksize.width-1)×0.5-1] + 0.8
  #sigmaY = 0.3×[(ksize.height-1)×0.5-1] + 0.8
#borderType:边界样式,该值决定了以何种方式处理边界。一般情况下,不需要考虑该值,直接采用默认值即可。

4.代码实现

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-5yLyyzhC-1684071099512)(C:Users86185Desktop学习笔记图片屏幕截图 2023-05-11 143604.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-YOG3sUZE-1684071099513)(C:Users86185Desktop学习笔记图片屏幕截图 2023-05-11 143639.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Ru1G3dFI-1684071099514)(C:Users86185Desktop学习笔记图片屏幕截图 2023-05-11 143656.png)]

2.2.3中值滤波

1.基本概念

就是把每一个像素点的值替换成按周围区域的像素点按从小到大依次排列的像素值的中位数。

2.基本语法

# 在OpenCV中,实现中值滤波的函数是cv2.medianBlur(),其语法格式如下:

         #dst=cv2.medianBlur(src,ksize)

        #式中:

       # ● dst是返回值,表示进行中值滤波后得到的处理结果。

        # ● src 是需要处理的图像,即源图像。

        #● ksize 是滤波核的大小。滤波核大小是指在滤波处理过程中其邻域图像的高度和宽度。需要注意,核大小必须是比1大的奇数,比如3、5、7等。 

2.3图像形态学

1.形态学运算之图像腐蚀和图像膨胀

1.引言

图像的腐蚀和膨胀是两种基本的形态学运算,主要用来寻找图像中的极大区域(膨胀)和极小区域(腐蚀),其中腐蚀类似,形象的来说,就是"领域被蚕食",将图像中的高亮区域或者是白色部分进行缩减细化,使得运行结果的图比原图的高亮区域更小,而对于膨胀来说,就是"领域被扩张",将图像的高亮区域与白色区域进行扩张,使得运行结果图比高亮的区域更大。图像腐蚀和膨胀是一种互换的原理。

2.基础知识

​ [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-FTnis3GW-1684071099515)(C:Users86185Desktop学习笔记图片2021031411033657.png)]

该公式表示用B来对图像A进行膨胀处理,其中B是一个卷积模板或卷积核,其形状可以为正方形或圆形,通过模板B与图像A进行卷积计算,扫描图像中的每一个像素点,用模板元素与二值图像元素做“与”运算,如果都为0,那么目标像素点为0,否则为1。从而计算B覆盖区域的像素点最大值,并用该值替换参考点的像素值实现膨胀。下图是将左边的原始图像A膨胀处理为右边的效果图A⊕B。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-hOhhbfbY-1684071099515)(C:Users86185Desktop学习笔记图片20210314110816307.jpg)]

​ 膨胀处理

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-F4ZzDtcn-1684071099516)(C:Users86185Desktop学习笔记图片20210314111135565.png)]

该公式表示图像A用卷积模板B来进行腐蚀处理,通过模板B与图像A进行卷积计算,得出B覆盖区域的像素点最小值,并用这个最小值来替代参考点的像素值。如图所示,将左边的原始图像A腐蚀处理为右边的效果图A-B

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-LTRJK5K5-1684071099517)(C:Users86185Desktop学习笔记图片20210314111240111.jpg)]

3.代码实现

图像腐蚀

图像形态学转换主要针对的是二值图像(0或1)。图像腐蚀类似于"领域被蚕食",将图像中的高亮区域或者是白色区域进行缩减细化,使得其运行结果图比原图的高亮区域更小。

其中函数语法

#图像腐蚀主要使用的是erode函数
dst=cv2.erode(src,kernal,iterations)
#参数解析
#dst是经过图像腐蚀后处理的结果,
#src是原始图像
#kernal是卷积核大小、
#通过numpy设置卷积核的大小
#np.ones((10,10),np.uint8)
#iterations是迭代次数,iterations默认是1,如果要迭代多次就可以自己设定迭代次数

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-5Mj2PMvn-1684071099517)(C:Users86185Desktop学习笔记图片屏幕截图 2023-05-14 130312.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-cosFuDUK-1684071099518)(C:Users86185Desktop学习笔记图片屏幕截图 2023-05-14 130408.png)]

图像膨胀

图像膨胀是对腐蚀操作的逆操作,类似于"领域扩张",将图像中的高亮区域或者是白色部分进行扩张,其运算结果图要比原图的高亮区域更加大,线条变粗了。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-JffdSvj9-1684071099519)(C:Users86185Desktop屏幕截图 2023-05-14 134018.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ypxvWn24-1684071099520)(C:Users86185Desktop学习笔记图片屏幕截图 2023-05-14 134125.png)]

2.开运算和闭运算

2.1闭运算

开运算:先进行腐蚀操作再进行膨胀操作

1)为什么开运算可以去白噪点呢?

根据腐蚀的原理,如果一副图里面有白色噪点,使用腐蚀操作,当这幅图里面在卷积核中与之覆盖的二值图像进行操作的时候,进行与操作,就是在覆盖后的模板区域大小的时候,结果一般都有白色噪点以及大部分都是黑色区域,所以结果一般都是0,黑色。也就是使得白色噪点变成了黑色,腐蚀之后的图像也会变瘦,那么再次使用膨胀操作,结果一般都是1,就会使得图像被膨胀,恢复到原来的图像了,即去除了白色噪点。

2)语法解析

#函数解析
#cv2.morphologyEx(src,op,kernel,dst,ancher,iterations,borderType,borderValue=None)
#morphology是形态学的意思,morphologyEX()就是形态学开运算闭运算的函数了
#src是输入图像,即原始图像
#op是进行的操作(开运算(cv2.MORPH_OPEN)还是闭运算(cv2.MORPH_CLOSE))
#kernal是卷积的大小
#dst是输出图,经过开运算和闭运算的处理之后的图
#ancher是描点,一般是卷积的中心
#iterations是迭代次数

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-cdKEW0us-1684071099520)(C:Users86185Desktop学习笔记图片屏幕截图 2023-05-14 144830.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-fq1K0HSa-1684071099521)(C:Users86185Desktop学习笔记图片屏幕截图 2023-05-14 144932.png)]

由此可见,使用图像形态学处理的开运算操作,可以取出图像的白色噪点。

2.2闭运算

什么是闭运算?先进行膨胀再进行腐蚀操作

为什么可以用闭运算来去除黑色噪点?

其实先进行膨胀操作的时候,可以使得模板和原始图像覆盖住之后在黑色噪点区域上的最后的结果是1,就是把黑色噪点先去除,但是进行了膨胀操作之后,图像的高亮区域和白色区域相比于之前的图像之后会变胖,就可以用腐蚀操作使得图像变回原来的样子,起到了去除图像黑色噪点的效果。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-yFPFMKos-1684071099522)(C:Users86185Desktop学习笔记图片屏幕截图 2023-05-09 104117.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-PAtAhCZh-1684071099523)(C:Users86185Desktop学习笔记图片屏幕截图 2023-05-14 151000.png)]

可见,闭运算可以去除图像中的黑色噪点

3.梯度运算

梯度运算就是把在原图的基础上进行膨胀后的图像和进行腐蚀后的图像一个相减的操作,最后得到的是一个类似于图像轮廓的一个图像。

#用膨胀后的图形减去腐蚀后的图形,这是MorphologyEx中的唯一的一种梯度运算的方式,也是基本梯度运算
#cv2.MorphologyEx(src,cv2.MORPH_GRADIENT,kernal)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-0F9Jjfr9-1684071099523)(C:Users86185Desktop学习笔记图片屏幕截图 2023-05-14 153442.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-vFAwpfUe-1684071099524)(C:Users86185Desktop学习笔记图片屏幕截图 2023-05-14 153541.png)]

4.顶帽和黑帽

4.1顶帽运算

顶帽运算是一个获取图像噪声的运算,是用元素图像减去图像开运算而得到的一个结果。

顶帽运算=原始图像-开运算

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-0WDjs2ts-1684071099525)(C:Users86185Desktop学习笔记图片屏幕截图 2023-05-14 155925.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-jbgRar8W-1684071099525)(C:Users86185Desktop学习笔记图片屏幕截图 2023-05-14 160002.png)]

可视化过程代码

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-NJidlGa7-1684071099526)(C:Users86185Desktop学习笔记图片屏幕截图 2023-05-14 161042.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-0FVrbiLh-1684071099527)(C:Users86185Desktop学习笔记图片屏幕截图 2023-05-14 161116.png)]

4.2黑帽操作

黑帽处理是主要是用来获取图像内部的小孔的操作

黑帽操作=闭运算-原始图像

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-5h7q6URR-1684071099527)(C:Users86185Desktop学习笔记图片屏幕截图 2023-05-14 162234.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-6LgUY8nL-1684071099528)(C:Users86185Desktop学习笔记图片屏幕截图 2023-05-14 162509.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-zbkIZ2yC-1684071099529)(C:Users86185Desktop学习笔记图片屏幕截图 2023-05-14 163203.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-yfccybyx-1684071099530)(C:Users86185Desktop学习笔记图片屏幕截图 2023-05-14 163251.png)]

2.4图像梯度计算

梯度是指图像某一个像素点两边的颜色差异值,两边颜色相同的像素点梯度为0,所以只有边界像素点才有梯度。

1 Sobel算子

sobel算子是一种典型的基于一阶导数的边缘检测算子,由于该算子引入了类似局部平均的运算,因此对噪声具有平滑作用,能够很好的消除噪声的影响。对图像的边缘进行检测的一种算子,sobel算子对像素的位置的影响做了加权。

原理:sobel算子包含两组3*3的矩阵,分别为横向模板和纵向模板。将之与图像做平面卷积,即可得到横向方向和纵向方向的亮度差分近视值。

水平方向边缘检测模板

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-rJdnkSMO-1684071099530)(C:Users86185Desktop学习笔记图片屏幕截图 2023-05-14 200258.png)]

垂直方向边缘检测模板

GY=

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-bgKBLjuu-1684071099531)(C:Users86185Desktop学习笔记图片屏幕截图 2023-05-14 200458.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-1eYzaMmV-1684071099532)(C:Users86185Desktop学习笔记图片屏幕截图 2023-05-14 200616.png)]

如图所示是Gx和Gy的求法,水平方向上是把右边的值减去左边然后再求和,要注意前面的系数。在垂直方向上就是把下面的值减去上面的值然后再进行求和,也要注意到前面的系数,的,但是在求值的时候,难免会有出现负数的情况,根据图像的阈值操作,会把负数直接记为0。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-HNa0wuQl-1684071099532)(C:Users86185Desktop学习笔记图片屏幕截图 2023-05-14 201433.png)]

A的右边的像素值是0,左边是最亮的点255,右边减去左边有-255是一个负数的值,会变为0,那么就是说左边这一块都是黑色的,而B的右边是255,左边是0,右边减去左边是255,那么就是一个正数,就会是一个白色的边界。所以我们要把他的图像深度设置为一个不同与之前的形态(因为在处理的过程中,图像的像素会发生改变),然后再对它取绝对值。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-knFOm4xN-1684071099533)(C:Users86185Desktop学习笔记图片屏幕截图 2023-05-14 202036.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-qcyOlvOR-1684071099534)(C:Users86185Desktop学习笔记图片屏幕截图 2023-05-14 202126.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-R6H31z6V-1684071099534)(C:Users86185Desktop学习笔记图片屏幕截图 2023-05-14 202238.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-gqBpJ6ZP-1684071099535)(C:Users86185Desktop学习笔记图片屏幕截图 2023-05-14 202346.png)]

所以要想获得图像的边缘,需要先对图像进行sobelx和y操作,然后再对x和y进行一个结合(利用addWeighted),最后打印出边缘操作结果。有着代码演示

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-55Y6IPA6-1684071099535)(C:Users86185Desktop学习笔记图片屏幕截图 2023-05-14 204631.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-aTTeJZTF-1684071099536)(C:Users86185Desktop学习笔记图片屏幕截图 2023-05-14 204709.png)]

2.Scharr算子

scharr模板算子比sobel模板对梯度更加地敏感

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-0IAlI4dq-1684071099537)(C:Users86185Desktop学习笔记图片屏幕截图 2023-05-14 205227.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-XUtIXxaS-1684071099537)(C:Users86185Desktop学习笔记图片屏幕截图 2023-05-14 205250.png)]

这个的权重比上一个更加地敏感,处理起来的边缘检测也更加地精细

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-hp05bScS-1684071099538)(C:Users86185Desktop学习笔记图片屏幕截图 2023-05-14 205857.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-YhrkFayA-1684071099539)(C:Users86185Desktop学习笔记图片屏幕截图 2023-05-14 205933.png)]

3.拉普拉斯算子

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-m3xO0iIh-1684071099539)(C:Users86185Desktop学习笔记图片屏幕截图 2023-05-14 210518.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-DWfK5RnG-1684071099540)(C:Users86185Desktop学习笔记图片屏幕截图 2023-05-14 211411.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-gSED2raf-1684071099540)(C:Users86185Desktop学习笔记图片屏幕截图 2023-05-14 211431.png)]

总结:scharr算子对边界像素描述要比sobel算子更加细致,可以获得更加丰富的边界信息。

laplacian算子因为对噪音更加敏感,描述边界像素的效果不是特别好,因此一般不单独使用laplacian算子

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-hSjAroJN-1684071099541)(C:Users86185Desktop学习笔记图片屏幕截图 2023-05-14 212747.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-DD2eOjpY-1684071099541)(C:Users86185Desktop学习笔记图片屏幕截图 2023-05-14 212758.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-yGVzmPMI-1684071099542)(C:Users86185Desktop学习笔记图片屏幕截图 2023-05-14 212841.png)]
更加地精细

[外链图片转存中…(img-hp05bScS-1684071099538)]

[外链图片转存中…(img-YhrkFayA-1684071099539)]

3.拉普拉斯算子

[外链图片转存中…(img-m3xO0iIh-1684071099539)]

[外链图片转存中…(img-DWfK5RnG-1684071099540)]

[外链图片转存中…(img-gSED2raf-1684071099540)]

总结:scharr算子对边界像素描述要比sobel算子更加细致,可以获得更加丰富的边界信息。

laplacian算子因为对噪音更加敏感,描述边界像素的效果不是特别好,因此一般不单独使用laplacian算子

[外链图片转存中…(img-hSjAroJN-1684071099541)]

[外链图片转存中…(img-DD2eOjpY-1684071099541)]

[外链图片转存中…(img-yGVzmPMI-1684071099542)]

风语者!平时喜欢研究各种技术,目前在从事后端开发工作,热爱生活、热爱工作。