从零搭建 OpenCV 项目(新手向)-- 第四天 OpenCV图像预处理(三)

目录

一、图像掩膜

1. 图像掩膜的基本原理

1.1 为什么要转为HSV?

1.1.1 更容易提取颜色区域

1.1.2 更稳定的颜色识别

1.1.3 方便进行图像分割和掩膜制作

1.1.4 更加符合人类直觉

2. 图像掩膜的应用

3. 制作掩膜

4. 与运算

5. 颜色替换

二、ROI切割

1. 什么是 ROI?

2. ROI 的作用

3. ROI 的本质

三、图像添加水印

1. 模板输入

2. 与运算

3. 图像融合(图像位与操作)

4. 案例:将logo作为水印加在bg上 

四、图像噪点消除

1. 相关概念:噪声&滤波器

1.1 噪声

1.2 滤波器

2.五种滤波 

2.1 均值滤波

2.2 方框滤波

2.3 高斯滤波

2.4 中值滤波

2.5 双边滤波

2.6 各种滤波对比总结

 2.7综合案例


一、图像掩膜

图像掩膜(Image Mask)是图像处理中常用的一种技术,主要用于对图像的特定区域进行操作。掩膜是一个与原图像大小相同或相对较小的矩阵(通常为二值图像),其值决定了在图像处理中需要关注或操作的区域。

1. 图像掩膜的基本原理

图像掩膜是通过特定规则将图像的某些区域设为“关注区域”,并对这些区域进行处理。掩膜通常有两个关键特点:

  • 值为1(或255)表示关注区域:掩膜中的这些位置将对图像的相应部分进行操作。

  • 值为0(或0)表示不关注区域:掩膜中的这些位置对应的图像部分不会被操作。

图像掩膜中使用 HSV 色彩空间 是图像处理中非常常见的技巧,特别适合进行颜色区域提取、目标检测、图像分割等操作。这是因为 HSV 空间能更容易、准确地区分颜色,不受光照影响大。

1.1 为什么要转为HSV?

1.1.1 更容易提取颜色区域

HSV 把“颜色种类”(H)单独分离出来,使得我们只需要关心 H 通道就可以提取特定颜色。

示例

  • 想提取图像中的“红色”区域,用 HSV 可以只关注 H 值在 010 和 160179。

  • 而 RGB 中红色可能对应不同的 (R, G, B) 值,判断复杂。


1.1.2 更稳定的颜色识别

在不同光照条件下,RGB 数值会大幅度变化,但 HSV 中的色调(H)往往保持稳定,抗光照变化能力强。


1.1.3 方便进行图像分割和掩膜制作
  • 使用 HSV 可以轻松通过 cv2.inRange() 获取目标颜色区域的掩膜。

  • 比如你要分割一块绿色区域,只需要设置 H 通道在绿色范围就可以。


1.1.4 更加符合人类直觉
  • HSV 空间接近人类对颜色的理解,例如红是“红”,绿是“绿”,而不需要思考 R、G、B 的比例。

  • 适合人机交互和界面设计。

2. 图像掩膜的应用

  1. 图像过滤:使用掩膜对图像进行过滤处理,常见的如边缘检测、模糊等。例如,在卷积操作中,掩膜用于定义卷积核的形状和大小。

  2. 图像分割:掩膜常用于图像分割任务,将图像分成不同的区域。通过对掩膜的操作,可以提取出图像中的特定部分。

  3. 图像合成:在图像合成过程中,可以使用掩膜来选择哪些区域进行合成。例如,把一个水印添加到图像中时,可以用掩膜来限制水印的位置和大小。

  4. 图像增强:在增强图像的某些区域时,掩膜可以帮助集中处理特定区域。

3. 制作掩膜

掩膜(Mask)是一种在图像处理中常见的操作,它用于选择性地遮挡图像的某些部分,以实现特定任务的目标。掩膜通常是一个二值化图像,并且与原图像的大小相同,其中目标区域被设置为1(或白色),而其他区域被设置为0(或黑色),并且目标区域可以根据HSV的颜色范围进行修改,如下图就是制作红色掩膜的过程:

 通过这个掩膜,我们就可以对掩膜中的白色区域所对应的原图中的区域进行处理与操作。

mask=cv.inRange(img,color_low,color_high)
  • cv2.inRange用于进行多通道图像(尤其是彩色图像)的阈值操作。

4. 与运算

我们在高中时学过逻辑运算中的“与”运算,其规则是当两个命题都是真时,其结果才为真。而在图像处理中,“与”运算被用来对图像的像素值进行操作。具体来说,就是将两个图像中所有的对应像素值一一进行“与”运算,从而得到新的图像。从上面的图片我们可以看出,掩膜中有很多地方是黑色的,其像素值为0,那么在与原图像进行“与”运算的时候,得到的新图像的对应位置也是黑色的,如下图所示:

 

 通过掩膜与原图的与运算,我们就可以提取出图像中被掩膜覆盖的区域(扣图)。

cv2.bitwise_and(src1,src2[,mask])
  • src1:第一个输入数组。通常是输入的原始图像。8+

  • src2:第二个输入数组。它可以是另一个图像、一个常数值或者与 src1 相同的图像。

    • 当应用掩膜时,这个参数经常就是src1本身;即对同一个图像进行操作。

    • 如果对两个不同的图像执行按位与操作(例如,将两张图片的某些部分组合在一起),可以分别将它们作为 src1src2 输入到 cv2.bitwise_and() 函数中,创建复杂的图像效果或进行图像合成。

  • mask:掩膜(可选)。输入数组元素只有在该掩膜非零时才被处理。是一个8位单通道的数组,尺寸必须与src1src2相同。

  • 返回值:输出数组,应用掩膜后的图像,与输入数组大小和类型相同。

掩膜案例: 

import cv2 as cv
import numpy as np
demo = cv.imread("D:\OpenCV_notes\day02\images\demo.png")
demo = cv.resize(demo, (640, 480))
#转为HSV颜色空间
hsv = cv.cvtColor(demo, cv.COLOR_BGR2HSV)
#定义颜色范围
lower = np.array([0,43,46])
higher = np.array([10,255,255])
#创建掩膜 cv.inRange(img,lower,higher,mask) 传的是hsv颜色空间下的图像
mask = cv.inRange(hsv, lower, higher)
#颜色提取 与运算 cv.bitwise_and(img,img,mask=mask) 
# 原图和掩膜进行与运算 传的是原图像
dst = cv.bitwise_and(demo, demo, mask=mask)
cv.imshow("dst", dst)
cv.imshow("demo", demo)
cv.imshow("mask", mask)

print(demo.shape)
print(mask.shape)

cv.waitKey(0)
cv.destroyAllWindows()

 原图:

掩膜--mask:

与运算后--dst:

5. 颜色替换

前一个实验中,我们已经能够识别到图像中的某一种颜色,那么我们就可以对识别到的颜色进行一个操作,比如将其替换成别的颜色,其原理就是在得到原图的掩膜之后,对掩膜中的白色区域所对应的原图中的区域进行一个像素值的修改即可。

 

案例:

import cv2 as cv
import numpy as np
demo = cv.imread("D:\OpenCV_notes\day02\images\demo.png")
demo = cv.resize(demo, (640, 480))
#转为HSV颜色空间
hsv = cv.cvtColor(demo, cv.COLOR_BGR2HSV)
#定义颜色范围
lower = np.array([0,43,46])
higher = np.array([10,255,255])
#创建掩膜 cv.inRange(img,lower,higher,mask) 传的是hsv颜色空间下的图像
mask = cv.inRange(hsv, lower, higher)
#颜色替换
arr=mask==255
demo[arr] = [0,0,0]


cv.imshow("demo", demo)
cv.imshow("mask", mask)

print(demo.shape)
print(mask.shape)

cv.waitKey(0)
cv.destroyAllWindows()

 已经覆盖上掩膜后的原图--demo:

颜色替换后的掩膜--mask:

二、ROI切割

1. 什么是 ROI?

ROI(Region of Interest)指的是图像中我们感兴趣的一部分区域。通常用于对图像的局部进行操作,比如提取、处理或分析该区域。

在编程中,ROI 就是从图像中裁剪出一个矩形区域,作为子图像来操作。

2. ROI 的作用

应用场景说明
局部处理对图像的特定区域进行滤波、增强、模糊、检测等
特征提取提取图像局部的颜色、纹理、边缘特征
图像合成将一个小图贴到原图中的特定位置
目标检测后处理只对检测框中的区域做进一步操作,例如 OCR、分类等

3. ROI 的本质

  • ROI 是通过数组切片操作提取图像的子区域。

  • 在 OpenCV(基于 NumPy)中,图像是一个多维数组,ROI 也是数组的子集。

  • 默认提取出的 ROI 与原图共享内存,操作 ROI 会影响原图。

在之后水印的案例中会有所体现

三、图像添加水印

  本实验中添加水印的概念其实可以理解为将一张图片中的某个物体或者图案提取出来,然后叠加到另一张图片上。具体的操作思想是通过将原始图片转换成灰度图,并进行二值化处理,去除背景部分,得到一个类似掩膜的图像。然后将这个二值化图像与另一张图片中要添加水印的区域进行“与”运算,使得目标物体的形状出现在要添加水印的区域。最后,将得到的目标物体图像与要添加水印的区域进行相加,就完成了添加水印的操作。这样可以实现将一个图像中的某个物体或图案叠加到另一个图像上,从而实现添加水印的效果。就本实验而言,会用到两个新的组件,一个是模板输入,一个是图像融合。

1. 模板输入

其实,该组件起到的就是图片输入的功能,只不过使用模板输入所输入的图片其实是作为要添加的水印,有了水印的彩色图之后,我们需要用它来制作一个掩模,这就用到了灰度化和二值化,即先灰度化后二值化,这就得到了带有水印图案的掩模。

  

原图   |  灰度化    |   二值化

2. 与运算

有了模板的掩膜之后(也就是二值化图),我们就可以在要添加水印的图像中,根据掩膜的大小切割出一个ROI区域,也就是我们要添加水印的区域,之后让其与模板的掩膜进行与运算,我们知道,与运算的过程中,只要有黑色像素,那么得到的结果图中的对应位置也会是黑色像素。由于模板的掩膜中目标物体的像素值为黑色,所以经过与运算后,就会在ROI区域中得到模板图的形状。

3. 图像融合(图像位与操作)

将模板的形状添加到水印区域之后,就可以将该图像与原始的模板图进行图像融合。该组件的目的就是将图像对应的数组中的对应元素进行相加(一定要注意这里的两个数组是规格相同的,也就是说要么都是灰度图,要么都是彩图),其过程如下图所示。

 因此就可以让原始的模板图与添加模板图形状的ROI区域进行图像融合,得到添加水印的ROI区域

原始的模板图添加模板图形状的ROI区域添加水印的ROI区域

4. 案例:将logo作为水印加在bg上 

bg:

logo:

import cv2 as cv
import numpy as np
logo = cv.imread("D:\OpenCV_notes\day03\images\logo1.png")
bg = cv.imread("D:\OpenCV_notes\day03\images\\cao.png")
h,w=logo.shape[0:2]#h,w
roi = bg[:h,:w]
#转灰度
logo_gray = cv.cvtColor(logo,cv.COLOR_BGR2GRAY)

#二值化 阈值法
#黑logo白底 与上背景
_,mask1=cv.threshold(logo_gray,200,255,cv.THRESH_BINARY)
bg1=cv.bitwise_and(roi,roi,mask=mask1)
cv.imshow("mask1",mask1)
cv.imshow("bg1",bg1)

#白logo黑底 与上logo1 反阈值法
_,mask2=cv.threshold(logo_gray,200,255,cv.THRESH_BINARY_INV)
logo_1=cv.bitwise_and(logo,logo,mask=mask2)
cv.imshow("mask2",mask2)
cv.imshow("bg2",logo_1)
#结果相加  
#融合roi[:]=cv.add(bg1,logo_1)
dst=cv.add(bg1,logo_1)
roi[:]=dst
cv.imshow("result",roi)

cv.imshow("dst",dst)

cv.waitKey(0)
cv.destroyAllWindows()

黑logo白底--mask1:

与上背景bg--bg1:

白logo黑底--mask2:

与上logo1--bg2:

融合roi--result:

整个逻辑思维:

阶段思考问题关键操作
加载阶段图像从哪里来?大小如何?imread(),获取尺寸,提取 ROI
分离阶段如何区分 logo 和背景?cvtColor() 转灰度
掩膜构建如何让程序识别前景和背景?threshold() 构建掩膜
掩膜作用如何提取 logo,去除背景?bitwise_and() 提取和遮盖
图像融合如何组合两图不冲突?add() 相加,roi[:] = 替换结果

四、图像噪点消除

1. 相关概念:噪声&滤波器

1.1 噪声

噪声:指图像中的一些干扰因素,通常是由图像采集设备、传输信道等因素造成的,表现为图像中随机的亮度,也可以理解为有那么一些点的像素值与周围的像素值格格不入。常见的噪声类型包括高斯噪声和椒盐噪声。高斯噪声是一种分布符合正态分布的噪声,会使图像变得模糊或有噪点。椒盐噪声则是一些黑白色的像素值分布在原图像

高斯噪声原图椒盐噪声

 注意:椒盐噪声可以理解为斑点,随机出现在图像中的黑点或白点;高斯噪声可以理解为拍摄图片时由于光照等原因造成的噪声。

1.2 滤波器

滤波器:也可以叫做卷积核,与自适应二值化中的核一样,本身是一个小的区域,有着特定的核值,并且工作原理也是在原图上进行滑动并计算中心像素点的像素值。滤波器可分为线性滤波和非线性滤波,线性滤波对邻域中的像素进行线性运算,如在核的范围内进行加权求和,常见的线性滤波器有均值滤波、高斯滤波等。非线性滤波则是利用原始图像与模板之间的一种逻辑关系得到结果,常见的非线性滤波器中有中值滤波器、双边滤波器等。

滤波与模糊联系与区别:

  • 它们都属于卷积,不同滤波方法之间只是卷积核不同(对线性滤波而言)

  • 低通滤波器是模糊,高通滤波器是锐化

  • 低通滤波器就是允许低频信号通过,在图像中边缘和噪点都相当于高频部分,所以低通滤波器用于去除噪点、平滑和模糊图像。高通滤波器则反之,用来增强图像边缘,进行锐化处理。

2.五种滤波 

2.1 均值滤波

均值滤波是一种最简单的滤波处理,它取的是卷积核区域内元素的均值,如3×3的卷积核:

k e r n e l={\frac{1}{9}}{\Bigg[}\begin{array}{l l l}{1}&{1}&{1}\\{1}&{1}&{1}\\{1}&{1}&{1}\end{array}{\Bigg]}\displaystyle

在滤波算法组件中,当参数filtering_method选为均值滤波,参数component_param为ksize,代表卷积核的大小,eg:ksize=3,则代表使用3×3的卷积核。

比如有一张4*4的图片,现在使用一个3*3的卷积核进行均值滤波时,其过程如下所示:

 对于边界的像素点,则会进行边界填充,以确保卷积核的中心能够对准边界的像素点进行滤波操作。在OpenCV中,默认的是使用BORDER_REFLECT_101的方式进行填充,下面的滤波方法中除了中值滤波使用的是BORDER_REPLICATE进行填充之外,其他默认也是使用这个方式进行填充,因此下面就不再赘述。通过卷积核在原图上从左上角滑动计算到右下角,从而得到新的4*4的图像的像素值。

2.2 方框滤波

方框滤波跟均值滤波很像,如3×3的滤波核如下:

k e r n e l={a}{\Bigg[}\begin{array}{l l l}{1}&{1}&{1}\\{1}&{1}&{1}\\{1}&{1}&{1}\end{array}{\Bigg]}\displaystyle

 在滤波算法组件中,当参数filtering_method选为方框滤波时,参数component_param为ksize,ddepth,normalize。下面讲解这3个参数的含义:

 

 

  • ksize:代表卷积核的大小,eg:ksize=3,则代表使用3×3的卷积核。

  • ddepth:输出图像的深度,-1代表使用原图像的深度。

    • 图像深度是指在数字图像处理和计算机视觉领域中,每个像素点所使用的位数(bit depth),也就是用来表示图像中每一个像素点的颜色信息所需的二进制位数。图像深度决定了图像能够表达的颜色数量或灰度级。

  • normalize:当normalize为True的时候,方框滤波就是均值滤波,上式中的a就等于1/9;normalize为False的时候,a=1,相当于求区域内的像素和。

其滤波的过程与均值滤波一模一样,都采用卷积核从图像左上角开始,逐个计算对应位置的像素值,并从左至右、从上至下滑动卷积核,直至到达图像右下角,唯一的区别就是核值可能会不同。

 

2.3 高斯滤波

高斯滤波是一种常用的图像处理技术,主要用于平滑图像、去除噪声。它通过使用高斯函数(正态分布)作为卷积核来对图像进行模糊处理。

前面两种滤波方式,卷积核内的每个值都一样,也就是说图像区域中每个像素的权重也就一样。高斯滤波的卷积核权重并不相同:中间像素点权重最高,越远离中心的像素权重越小。还记得我们在自适应二值化里是怎么生成高斯核的吗?这里跟自适应二值化里生成高斯核的步骤是一样的,都是以核的中心位置为坐标原点,然后计算周围点的坐标,然后带入下面的高斯公式中。

g(x,y)=\frac{1}{2\pi\sigma^{2}}e^{-\frac{(x^{2}+y^{2})}{2\sigma^{2}}}\displaystyle

 

其中,x和 y 是相对于中心点的坐标偏移量,σ 是标准差,控制着高斯函数的宽度和高度。较大的 σ 值会导致更广泛的平滑效果。

卷积核通常是一个方形矩阵,其元素值根据高斯函数计算得出,并且这些值加起来等于1,近似于正态分布,以确保输出图像的亮度保持不变。

其中的值也是与自适应二值化里的一样,当时会取固定的系数,当kernel大于7并且没有设置时,会使用固定的公式进行计算$\sigma$的值:

 \sigma=0.3*\left((k s i z e-1)*0.5-1\right)+0.8\displaystyle

 我们还是以3*3的卷积核为例,其核值如下所示:

\ k e r n e l=\left[\begin{array}{c}{​{0.0625~~~~0.125~~~~0.0625}}\\{​{0.125~~~~0.25~~~~0.125}}\\{​{0.0625~~~~0.125~~~~0.0625}} \end{array}\right]=\left[\begin{array}{c c c}{\frac{1}{16}~~~\frac{1}{8}~~~\frac{1}{16}}\\{\frac{1}{8}~~~\frac{1}{4}~~~\frac{1}{8}}\\{\frac{1}{16}~~~\frac{1}{8}~~~\frac{1}{16}}\end{array}\right]\displaystyle

 

得到了卷积核的核值之后,其滤波过程与上面两种滤波方式的滤波过程一样,都是用卷积核从图像左上角开始,逐个计算对应位置的像素值,并从左至右、从上至下滑动卷积核,直至到达图像右下角,唯一的区别就是核值不同。

在滤波算法组件中,当参数filtering_method选为高斯滤波,参数component_param为ksize,sigmaX。下面讲解这2个参数的含义:

 

 

ksize:代表卷积核的大小,eg:ksize=3,则代表使用3×3的卷积核。

sigmaX:就是高斯函数里的值,σx值越大,模糊效果越明显。高斯滤波相比均值滤波效率要慢,但可以有效消除高斯噪声,能保留更多的图像细节,所以经常被称为最有用的滤波器。均值滤波与高斯滤波的对比结果如下(均值滤波丢失的细节更多):

 

2.4 中值滤波

中值又叫中位数,是所有数排序后取中间的值。中值滤波没有核值,而是在原图中从左上角开始,将卷积核区域内的像素值进行排序,并选取中值作为卷积核的中点的像素值,其过程如下所示:

 

中值滤波就是用区域内的中值来代替本像素值,所以那种孤立的斑点,如0或255很容易消除掉,适用于去除椒盐噪声和斑点噪声。中值是一种非线性操作,效率相比前面几种线性滤波要慢。

比如下面这张斑点噪声图,用中值滤波显然更好:

 

 在滤波算法组件中,当参数filtering_method选为中值滤波,参数component_param为ksize,代表卷积核的大小,eg:ksize=3,则代表使用3×3的卷积核。

2.5 双边滤波

模糊操作基本都会损失掉图像细节信息,尤其前面介绍的线性滤波器,图像的边缘信息很难保留下来。然而,边缘(edge)信息是图像中很重要的一个特征,所以这才有了双边滤波。

可以看到,双边滤波明显保留了更多边缘信息,下面来介绍一下双边滤波。

双边滤波的基本思路是同时考虑将要被滤波的像素点的空域信息(周围像素点的位置的权重)和值域信息(周围像素点的像素值的权重)。为什么要添加值域信息呢?是因为假设图像在空间中是缓慢变化的话,那么临近的像素点会更相近,但是这个假设在图像的边缘处会不成立,因为图像的边缘处的像素点必不会相近。因此在边缘处如果只是使用空域信息来进行滤波的话,得到的结果必然是边缘被模糊了,这样我们就丢掉了边缘信息,因此添加了值域信息。

双边滤波采用了两个高斯滤波的结合,一个负责计算空间邻近度的权值(也就是空域信息),也就是上面的高斯滤波器,另一个负责计算像素值相似度的权值(也就是值域信息),也是一个高斯滤波器。其公式如下所示:

 g(i,j)=\frac{\sum_{(k,l)\in S(i,j)}f(k,l)\omega(i,j,k,l)}{\Sigma_{(k,l)\in S(i,j)}\omega(i,j,k,l)}\displaystyle

 

其中,

  • $S(i,j)$:指以$$(i,j)$$为中心的邻域的范围

  • $f(k,l)$:输入的点的像素值,也就是在原始图像中位置 $$(k,l)$$的像素值。

  • $\omega(i,j,k,l)$:这是权重函数,它决定了位置 $$(k,l)$$的像素值$f(k,l)$对位置$$(i,j)$$的贡献程度。

  • $g(i,j)$:表示中心点$$(i,j)$$的像素值,也就是经过双边滤波处理后,在位置$$(i,j)$$的像素值。

  • 分子:$∑(k,l)∈S(i,j)f(k,l)ω(i,j,k,l)$

    • 这是对邻域内所有像素值 $f(k,l)$与其对应的权重 $ω(i,j,k,l)$的乘积求和。这一步计算了加权后的像素值总和。

  • 分母:$∑(k,l)∈S(i,j)ω(i,j,k,l)$

    • 这是对邻域内所有像素的权重$ ω(i,j,k,l)$ 求和。这一步计算了权重的总和。

  • 计算过程:

    1. 确定邻域:选择一个以$ (i,j)$为中心的邻域$ S(i,j)$。

    2. 计算权重:对于邻域内的每个像素 $(k,l)$,计算其权重$ ω(i,j,k,l)$。

    3. 加权求和:将邻域内每个像素值 $f(k,l)$ 与其权重 $ω(i,j,k,l)$相乘,并对所有乘积求和。

    4. 归一化:将加权求和的结果除以权重总和,得到最终的像素值 $g(i,j)$。

上述公式我们进行转化,假设公式中$\omega(i,j,k,l)$为m,则有

g(i,j)=\frac{f_{1}\cdot m_{1}+f_{2}\cdot m_{2}+\dots+f_{n}\cdot m_{n}}{m_{1}+m_{2}+\dots+m_{n}}\displaystyle

 设$m{1}+m{2}+\cdots+m_{n}=M$,则有

 g(i,j)=f_{1}\cdot{\frac{m_{1}}{M}}+f_{2}\cdot{\frac{m_{2}}{M}}+\cdots+f_{n}\cdot{\frac{m_{n}}{M}}\displaystyle

 此时可以看到,这与上面的滤波中计算过程已经一模一样了,$\frac{m_{1}}{M}$就代表了第一个点的权重。接下来我们看看$\omega(i,j,k,l)$是怎么来的,令

\omega(i,j,k,l)=w_{s}*w_{r}\displaystyle

 而

 \omega_{s}=e^{-{\frac{(i-k)^{2}+(j-l)^{2}}{2\sigma_{s}{}^{2}}}}\displaystyle

\omega_{r}=e^{-{\frac{\|f(i,j)-f(k,l)\|^{2}}{2\sigma_{r}{}^{2}}}}\displaystyle 

 

可以看到,对于$\omega{S}$来说,这就是普通的高斯滤波函数,其带入的坐标是坐标值,${\boldsymbol{\sigma}}{s}$是程序输入值,该函数是在空间临近度上计算的。而$\omega_{r}$是计算像素值相似度,也是高斯函数带入坐标值,然后得到对应点的像素值,进行两个点像素值插值的绝对值的平方。也就是说,双边滤波的核值不再是一个固定值,而是随着滤波的过程在不断发生变化的。

在本实验中的滤波算法组件中,当参数filtering_method选为双边滤波,参数component_param为ksize,d,sigmaColor,sigmaSpace,下面讲解这4个参数的含义:

  • ksize:卷积核的大小

  • d:过滤时周围每个像素领域的直径,这里已经设置了核大小。d=9===>9x9

  • sigmaColor:在color space(色彩空间)中过滤sigma。参数越大,那些颜色足够相近的的颜色的影响越大。较大的sigmaColor值意味着更大的颜色差异将被允许参与到加权平均中,从而使得颜色相近但不完全相同的像素也能够相互影响。

  • sigmaSpace:在coordinate space(坐标空间)中过滤sigma。这个参数是坐标空间中的标准差,决定了像素位置对滤波结果的影响程度。它定义了在图像的空间域中,一个像素可以影响周围像素的最大距离。换句话说,它控制着滤波器作用的范围大小。

关于2个sigma参数:

简单起见,可以令2个sigma的值相等;9

如果他们很小(小于10),那么滤波器几乎没有什么效果;

如果他们很大(大于150),那么滤波器的效果会很强,使图像显得非常卡通化。

关于参数d:

过大的滤波器(d>5)执行效率低。

对于实时应用,建议取d=5;

对于需要过滤严重噪声的离线应用,可取d=9;

2.6 各种滤波对比总结

滤波器是否线性速度特点
均值滤波 是模糊噪声、简单
方框滤波 是均值计算
高斯滤波 是中等平滑自然、加权
中值滤波 否 去椒盐噪声效果好

在不知道用什么滤波器好的时候,优先高斯滤波,然后均值滤波。

斑点和椒盐噪声优先使用中值滤波。

要去除噪点的同时尽可能保留更多的边缘信息,使用双边滤波。

线性滤波方式:均值滤波、方框滤波、高斯滤波(速度相对快)。

非线性滤波方式:中值滤波、双边滤波(速度相对慢)。

 2.7综合案例

import cv2 as cv
import numpy as np
#读图
lvbo2=cv.imread("D:\OpenCV_notes\day02\images\lvbo2.png")
cv.imshow("lvbo2",lvbo2)
lvbo3=cv.imread("D:\OpenCV_notes\day02\images\lvbo3.png")
cv.imshow("lvbo3",lvbo3)
#均值滤波
dst1=cv.blur(lvbo2,(3,3))#卷积核值大小3*3
cv.imshow("dst1",dst1)

#方框滤波 cv.boxFilter(img,ddepth,ksize,normalize=True)
dst2=cv.boxFilter(lvbo2,-1,(3,3),normalize=True)
cv.imshow("dst2",dst2)

#高斯滤波 cv.GaussianBlur(img,ksize,sigmaX)
dst3=cv.GaussianBlur(lvbo2,(3,3),1)
cv.imshow("dst3",dst3)

#中值滤波 cv.medianBlur(img,ksize)
dst4=cv.medianBlur(lvbo3,3)
cv.imshow("dst4",dst4)

#双边滤波 cv.bilateralFilter(img,d,sigmaColor,sigmaSpace)
dst5=cv.bilateralFilter(lvbo2,9,75,75)
cv.imshow("dst5",dst5)

cv.waitKey(0)
cv.destroyAllWindows()

lvbo2:

lvbo3:

均值滤波--dst1:

方框滤波--dst2:

高斯滤波--dst3:

中值滤波--dst4:

双边滤波--dst5:

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值