当前位置: 首页 > ds >正文

人工智能——插值方法、边缘填充、图像矫正、图像掩膜、ROI切割、图像添加水印、图像噪点消除

一、插值方法

在 OpenCV 中,插值插值方法是用于处理图像缩放、旋转、仿射变换等操作时,计算目标像素值的技术。当图像尺寸发生变化(如放大或缩小)或进行几何变换时,新图像的像素位置可能与原始图像的像素位置不完全对应,此时就需要通过插值算法来估算这些新像素的值。

常见的插值方法有以下几种:最近邻插值、双线性插值、像素区域插值、双三次插值、Lanczos插值

(一)最近邻插值(cv.INTER_NEAREST)

        原理:将目标像素的位置映射到原始图像上,取距离最近的一个像素值作为结果

例如,若要将一幅图像放大,假设放大倍数为 2 倍,那么目标图像中坐标为 (2, 3) 的像素点,会去查找原始图像中与之最近的像素位置(可能是 (1, 1)、(1, 2) 等,取决于具体的距离计算方式,通常是简单的坐标差值绝对值比较),然后把原始图像该位置像素的属性值复制过来作为目标图像此像素的属性值

        特点:计算速度最快,但可能导致图像边缘出现锯齿或失真,适用于对速度要求高但精度要求不高的场景

(二)双线性插值(cv.INTER_LINEAR)

        原理:考虑目标像素在原始图像中对应的坐标位置,然后找到原图像中找到坐标点周围 2×2 邻域内的四个像素,在水平方向上分别对这四个点中同一行的两个点按照距离权重做线性插值,得到两个中间值;再在垂直方向上对这两个中间值按照其所在位置的距离权重进行线性插值,最终得到目标图像中该像素点的属性值。(简单说就是:通过看位置距离加权平均计算结果)

        特点:相较于最近邻插值,能有效减少图像的块状效应,使图像过渡更平滑自然,插值得到的图像视觉效果更好。

(三)像素区域插值(cv.INTER_AREA)

        原理:像素区域插值主要分两种情况,缩小图像和放大图像的工作原理并不相同

1、当使用像素区域插值方法进行缩小图像时,它就会变成一个均值滤波器,相当于对每个小区域内的像素值求平均,用这个平均值作为新的代表像素值,放在核的中心

2、当使用像素区域插值方法进行放大图像时

  • 如果图像放大的比例是整数倍,那么其工作原理与最近邻插值类似;

  • 如果放大的比例不是整数倍,那么就会调用双线性插值进行放大

        特点:这种插值方法能较好地保持图像的几何特征和像素之间的相对关系,在图像缩放等操作中可以避免一些不合理的像素值突变情况

(四)双三次插值(cv.INTER_CUBIC)

        原理:

        它是在双线性插值基础上的进一步扩展,使用了更多的原始图像像素点信息来进行插值计算。对于目标图像中的像素点对应的原始图像坐标(一般为非整数坐标),会选取其周围 16 个邻近的像素点(形成一个 4×4 的像素块)。

        然后通过一个双三次函数(通常是基于特定的多项式函数来拟合像素值的变化关系),根据这些像素点到目标像素点对应原始坐标位置的距离等因素确定其在函数中的权重,利用加权求和的方式计算出目标图像中该像素的属性值

目标像素点与原图像像素点的对应公式如下:

BiCubic基函数(双三次插值的权重函数):

        其中d代表目标像素与某个像素点直接的相对距离

        我们要做的就是将上面的16个点相较于p点的位置距离算出来,获取16像素所对应的权重,分别将一个目标像素点周围的16个点中其中一个的d_x和d_y(就是d,因为BiCubic函数是一维的,所以我们需要将像素点的行与列分开计算)带入函数分别求取x,y方向的权重。一次这样计算另外15个临近点的权重。最终我们就可以得到P所对应的目标图像B在(X,Y)处的像素值为:

        特点:可以生成质量较高的插值图像,在图像放大或缩小时能有效减少锯齿、模糊等现象,对于细节的保留和图像整体的平滑过渡效果较好。

(五)Lanczos插值(cv.INTER_LANCZOS4)

        原理:Lanczos插值方法与双三次插值的思想是一样的,不同的就是其需要的原图像周围的像素点的范围变成了8*8,并且不再使用BiCubic函数来计算权重,而是换了一个公式计算权重

        特点:能够在一定程度上避免图像插值过程中产生的振铃效应(图像边缘出现的波纹状伪像),同时对图像细节的还原效果较好,能生成视觉质量比较高的插值图像

(六)代码语法

函数API:本质其实还是图像的仿射变换,只是多加了一个插值方法的参数而已

cv2.warpAffine(src, M, dsize, dst=None, flags=cv2.INTER_LINEAR, borderMode=cv2.BORDER_CONSTANT, borderValue=0)
  • src:输入图像(原始图像)
  • M:仿射变换矩阵
  • dsize:输出图像的尺寸,格式为 (width, height)(宽 × 高)与图像 shape 中的 (height, width) 相反
  • dst(可选):用于预先分配输出图像的内存空间
  • flags:插值方法与可选标志的组合,就是我们今天讲的几个插值方法的参数,默认值为 cv2.INTER_LINEAR(双线性插值),有以下几个插值方法:
    • cv2.INTER_NEAREST:最近邻插值(速度快,画质差)
    • cv2.INTER_LINEAR:双线性插值(默认,均衡)
    • cv2.INTER_CUBIC:双三次插值(画质好,速度慢)
    • cv.INTER_AREA:像素区域插值
    • cv2.INTER_LANCZOS4:Lanczos 插值(画质最佳,速度最慢)
  • borderMode(可选):边界填充模式,用于处理变换后图像边缘超出原始图像范围的区域,默认值为 cv2.BORDER_CONSTANT,会在后面讲到

  • borderValue(可选)

    • 当 borderMode 为 cv2.BORDER_CONSTANT 时,指定边界填充的固定值,默认值为 0(黑色)。
    • 对于彩色图像,可传入 (B, G, R) 格式的颜色值(如 (255, 0, 0) 表示蓝色填充)

代码展示:

import cv2 as cv#读图
cat = cv.imread("../images/face.png")
w=cat.shape[1]//2
h=cat.shape[0]//2
#旋转
#获取旋转矩阵
M = cv.getRotationMatrix2D((w,h),40,0.5)#仿射变换
#最近邻插值
dst1 = cv.warpAffine(cat,M,(cat.shape[1],cat.shape[0],),cv.INTER_NEAREST,borderMode=cv.BORDER_REPLICATE)
cv.imshow("dst1",dst1)#双线性插值
dst2 = cv.warpAffine(cat,M,(cat.shape[1],cat.shape[0],),cv.INTER_LINEAR,borderMode=cv.BORDER_REFLECT)
cv.imshow("dst2",dst2)#像素区域插值  缩小:均值滤波 放大:整数 最近邻  不是整数  双线性
dst3 = cv.warpAffine(cat,M,(cat.shape[1],cat.shape[0],),cv.INTER_AREA,borderMode=cv.BORDER_REFLECT101)
cv.imshow("dst3",dst3)#双三次插值   16个4*4  wi  wj (权重)
dst4 = cv.warpAffine(cat,M,(cat.shape[1],cat.shape[0],),cv.INTER_CUBIC,borderMode=cv.BORDER_CONSTANT, borderValue=(255,255,255))
cv.imshow("dst4",dst4)#Lanczos插值   64个点 8*8
dst5 = cv.warpAffine(cat,M,(cat.shape[1],cat.shape[0],),cv.INTER_LANCZOS4,borderMode=cv.BORDER_WRAP)
cv.imshow("dst5",dst5)cv.waitKey(0)
cv.destroyAllWindows()

二、边缘填充

        边缘填充是指在图像进行几何变换(如旋转、缩放、仿射变换)或卷积操作时,对超出原始图像边界的像素区域进行填充的技术。当图像经过变换后,部分区域会超出原始图像的范围(例如旋转后图像角落会出现空白),此时需要用特定规则填充这些空白区域,以保证输出图像的完整性。

        边缘填充的作用:

  1. 保证图像尺寸完整:避免变换后图像出现 “残缺”,确保输出图像符合预期尺寸。
  2. 减少边界失真:在卷积、滤波等操作中,边缘像素的计算依赖邻域信息,填充可避免边缘像素因缺乏邻域而失真

        边缘填充的应用场景:

  1. 几何变换:图像旋转、缩放、仿射变换等操作中,处理超出原始边界的区域。
  2. 卷积与滤波:如平滑、锐化、边缘检测等操作,需对图像边缘进行填充以保证卷积核有效计算

(一)边界复制(BORDER_REOLICATE)

原理:用原始图像最边缘的像素值填充边界,即 “复制边缘像素”

        例如这样:

特点:填充区域与边缘像素一致。

适用场景:希望边界与原图边缘保持一致的场景

(二)边界反射(BORDER_REFLECT)

原理:以图像边缘为对称轴,镜像反射填充像素(包含边缘像素本身)

例如这样:

  • 特点:填充区域呈镜像对称
  • 适用场景:纹理图像的旋转、缩放

(三)边界反射101(BORDER_REFLECT_101)

原理:与边界反射类似,但镜像时不包含边缘像素本身(边缘像素作为对称轴,不重复)

例如这样:

(四)边界常数(BORDER_CONSTANT)

原理:用指定的固定值填充边界(需配合 borderValue 参数设置填充值)

(五)边界包裹(BORDER_WRAP)

原理:将图像视为周期性纹理,用图像另一端的像素填充边界(类似 “平铺” 效果)

比如这样:

三、图像矫正

        图像矫正它能将倾斜、变形的图像(如从斜角度拍摄的文档、建筑物)转换为正视角的正视图像,还原物体的真实几何形状,与仿射变换(仅处理平行线条)不同,透视变换可以处理非平行线条的变换,能将梯形校正为矩形、将倾斜的平面校正为正面视图,是处理透视畸变的核心技术

        作用:

  1. 修正透视畸变:消除因拍摄角度导致的图像变形(如斜拍的文档边缘呈梯形)。
  2. 还原真实比例:使矫正后的图像符合人眼正视视角,物体比例更接近真实。

        原理:

核心思想:通过一个 3×3 的透视变换矩阵(M),将原始图像上的点(x,y)映射到目标图像上的点(x',y'

即:

由此可以得到新的坐标表达式:

其中a11,a12....是旋转量和平移量

        实际代码书写中的步骤:  

  • 先确定原始图像的四个特征点,即手动或自动选取原始图像中的 4 个特征点(如文档的四个角)。
  • 然后自行确定目标图像中对应的 4 个点(如矩形的四个角)。
  • 通过 cv2.getPerspectiveTransform() 计算变换矩阵 M
  • 用 cv2.warpPerspective() 应用变换矩阵,得到矫正后的图像。
计算透视变换矩阵:cv2.getPerspectiveTransform(srcPoints, dstPoints)
  • srcPoints:原始图像中的 4 个点,格式为 numpy.ndarray,形状为 (4, 2)(每行一个点,(x,y) 坐标),实际中可以先赋值给一个变量后再传参
  • dstPoints:目标图像中对应的 4 个点,格式同上
#原图中的四个角点# 原图中卡片的四个角点:左上、右上、左下、右下[[178, 100], [487, 134], [124, 267], [473, 308]]
#不一定要按照这个传入的顺序,但是两张图片传入的顺序要一样
pt1 = np.float32([[178, 100], [487, 134], [124, 267], [473, 308]])
pt2 = np.float32([[0,0],[shape[1],0],[0,shape[0]],[shape[1],shape[0]]])

应用透视变换:

cv2.warpPerspective(src, M, dsize, flags=cv2.INTER_LINEAR, borderMode=cv2.BORDER_CONSTANT, borderValue=0)
  • src:输入图像(原始图像),numpy.ndarray 类型。
  • M:3×3 的透视变换矩阵(由 getPerspectiveTransform() 生成)。
  • dsize:输出图像的尺寸,格式为 (width, height)(宽 × 高)。
  • flags(可选):插值方法,默认 cv2.INTER_LINEAR(双线性插值),其他选项见上。
  • borderMode(可选):边缘填充模式,默认 cv2.BORDER_CONSTANT(固定值填充),其他选项见下方说明。
  • borderValue(可选):当 borderMode=BORDER_CONSTANT 时的填充值,默认 0(黑色)

代码示例:

import cv2 as cv
import numpy as np
#读图
card = cv.imread("../images/3.png")
shape = card.shape
#获取变换矩阵
#原图中的四个角点# 原图中卡片的四个角点:左上、右上、左下、右下[[178, 100], [487, 134], [124, 267], [473, 308]]
#不一定要按照这个传入的顺序,但是两张图片传入的顺序要一样
pt1 = np.float32([[178, 100], [487, 134], [124, 267], [473, 308]])
pt2 = np.float32([[0,0],[shape[1],0],[0,shape[0]],[shape[1],shape[0]]])
M = cv.getPerspectiveTransform(pt1,pt2)
#透视变换
dst = cv.warpPerspective(card,M,(shape[1],shape[0]),cv.INTER_LINEAR,borderMode=cv.BORDER_REPLICATE)
cv.imshow("dst",dst)
cv.waitKey(0)
cv.destroyAllWindows()

四、图像掩膜

图像掩膜是一种与原始图像尺寸相同的二值化图像

  • 白色区域(像素值为 255 或 1):表示 “感兴趣区域(ROI)”,后续操作仅对该区域生效。
  • 黑色区域(像素值为 0):表示 “排除区域”,后续操作会忽略该区域。

简单说,掩膜就像一张 “模板”,通过遮挡不需要的区域,让图像处理只针对特定区域进行操作

        图像掩膜的作用:

  1. 区域选择:精准定位并隔离图像中的特定区域(如人脸、车牌、物体轮廓等)。
  2. 操作限制:使滤波、变换、分割等操作仅作用于感兴趣区域,避免影响其他区域。
  3. 噪声过滤:在保留目标区域的同时,去除背景噪声
  4. 图像融合:控制两张图像的融合范围(如将 logo 嵌入到指定区域)

        原理:

掩膜主要是进行逻辑运算

  • 当使用掩膜对图像进行处理时,会将原始图像与掩膜进行 “与(AND)” 操作。
  • 对于掩膜中像素值为 0 的区域,运算结果为 0(被屏蔽);
  • 对于掩膜中像素值为非 0 的区域,运算结果保留原始图像的像素值(被保留)。

        掩膜的制作方法:

根据需求不同,掩膜可通过手动绘制、阈值分割、边缘检测等方式制作

手动绘制规则形状掩膜

        适用于矩形、圆形等规则区域

import cv2
import numpy as np# 创建与原图同尺寸的黑色掩膜(全0)
img = cv2.imread("image.jpg")
mask = np.zeros(img.shape[:2], np.uint8)  # 单通道,尺寸与原图高宽一致# 绘制白色矩形(左上角(x1,y1),右下角(x2,y2))
cv2.rectangle(mask, (100, 100), (300, 300), 255, -1)  # -1表示填充内部# 绘制白色圆形(圆心(x,y),半径r)
cv2.circle(mask, (200, 200), 100, 255, -1)
基于阈值 / 边缘检测的自动掩膜

        适用于目标与背景对比度高的场景,其实就和昨天的阈值法是一个东西,以昨天例子中的花,最后生成的黑白图像就是掩膜

# 阈值分割生成掩膜(假设目标是亮区域)
_, mask = cv2.threshold(gray, 150, 255, cv2.THRESH_BINARY)  # 亮度>150的区域设为255

上面是根据RGB颜色空间进行的掩膜制作,但是在实际中常用到的是HSV颜色空间来进行掩膜制作:

cv2.inRange :主要用于根据图像中像素的颜色值,筛选出落在指定颜色区间内的像素,将这些像素标记为白色(255),区间外的像素标记为黑色(0),最终生成一个二值掩膜(单通道、像素值只有 0 和 255),方便后续仅对感兴趣的颜色区域进行处理

        常用于颜色分割,比如从图像中提取特定颜色的物体(如红色的花朵、蓝色的天空等 )

mask=cv.inRange(img,color_low,color_high)

        img:输入图像

        color_low:颜色区间的下限值,可以是单值(单通道情况 )或元组(多通道情况,如 RGB 下 (0, 0, 0)和HSV颜色空间下 ),表示各通道允许的最小值

        color_high:颜色区间的上限值和颜色区间下限相同

HSV颜色空间对应的颜色区间上限和下限值:

import cv2 as cv
import numpy as np#读取demo图像
demo = cv.imread("../images/demo.png")
demo =cv.resize(demo,(640,640))
#将图像转为HSV图像空间
hsv = cv.cvtColor(demo,cv.COLOR_BGR2HSV)
#定义颜色范围
low = np.array([0,43,46])
high = np.array([10,255,255])
#创建掩膜  cv.inRange(img,low,high)函数,此处传的是hsv颜色空间下的图像,一定是hsv图像吗?
mask = cv.inRange(hsv,low,high)#颜色提取cv.bitwise_and(img1,img2,mask=mask),img1和img2可以相同,那么就直接和掩膜进行与运输
res = cv.bitwise_and(demo,demo,mask=mask)cv.imshow("mask",mask)
cv.imshow("res",res)
cv.waitKey(0)
cv.destroyAllWindows()

        掩膜制作好后和进行运用,常与其他图像进行”与“操作:白色部分的掩膜和图像相”与“后还是原图像,黑色部分的掩膜和图像相”与“后就是黑色。这样操作后,就可以拿到我们白色的”感兴趣“区域

cv2.bitwise_and(src1, src2, mask=None)
  • src1:输入图像 1(通常为原始图像)
  • src2:当应用掩膜时,这个参数经常就是src1本身;即对同一个图像进行操作。如果对两个不同的图像执行按位与操作(例如,将两张图片的某些部分组合在一起),可以分别将它们作为 src1src2 输入到 cv2.bitwise_and() 函数中,创建复杂的图像效果或进行图像合成
  • mask:掩膜(可选)。输入数组元素只有在该掩膜非零时才被处理。是一个8位单通道的数组,尺寸必须与src1src2相同

        完成一个颜色替换的操作:

        1、先通过掩膜精确定位要替换颜色的区域

        2、再利用布尔运算取出掩膜中感兴趣区域(也就是白色区域) 

        3、对取到的感兴趣区域进行颜色赋值

import cv2 as cv
import numpy as np#读取demo图像
demo = cv.imread("../images/demo.png")
demo =cv.resize(demo,(640,640))
#将图像转为HSV图像空间
hsv = cv.cvtColor(demo,cv.COLOR_BGR2HSV)
#定义颜色范围
low = np.array([0,43,46])
high = np.array([10,255,255])
#创建掩膜  cv.inRange(img,low,high)函数,此处传的是hsv颜色空间下的图像,一定是hsv图像吗?
mask = cv.inRange(hsv,low,high)
#颜色替换
arr=mask==255demo[arr]=(0,255,0)cv.imshow("mask",mask)
cv.imshow("demo",demo)
cv.waitKey(0)
cv.destroyAllWindows()

六、ROI切割

这个很简单,所谓的ROI就是感兴趣区域,切割的原理也就是对数组的切片操作

七、图像添加水印

图像水印添加是将一张图片中的某个物体或者图案提取出来,然后叠加到另一张图片上

        步骤:

1、将背景图片转换成灰度图。去除背景部分,得到一个类似掩膜的图像

2、将这个二值化图像与背景图片中要添加水印的区域进行“与”运算,使得目标物体的形状出现在要添加水印的区域(先处理背景图,挖个洞,这个洞是黑色的)

3、处理logo,就是先去掉logo自己的背景,只留下图案(把logo作为目标区域logo变为白色,背景变为黑),然后把这个白色的logo(也就是logo的掩膜)和原图相与得到有颜色的logo

4、把挖好的这个洞(也就是原图中logo的位置)和去掉背景的logo进行饱和运算(就是把这两个图像的像素值相加)将得到的结果像素值赋值给切出来的图像。这样挖出来黑色洞的位置就被填成了logo的颜色

        

        梳理总结:

  1. 选位置:从背景图切出贴 logo 的区域(roi)。
  2. 挖洞:用 mask1 把 roi 中 logo 位置挖空(img1)。
  3. 扣贴纸:用 mask2 把 logo 自身背景扣掉(logo1)。
  4. 贴合:把扣好的贴纸(logo1)贴到挖好的洞里(img1 + logo1),结果放回 roi

代码实现:

import cv2 as cv
#读图
img = cv.imread("../images/bg.png")
logo = cv.imread("../images/logohq.png")
h,w=logo.shape[0:2]
roi = img[:h,:w]#转灰度图
gray = cv.cvtColor(logo,cv.COLOR_BGR2GRAY)
#二值化
#黑logo白底 和背景与
_,mask1 = cv.threshold(gray,200,255,cv.THRESH_BINARY)
img1 = cv.bitwise_and(roi,roi,mask=mask1)
cv.imshow("img1",img1)#白logo黑底 和logo与获取logo
_,mask2 = cv.threshold(gray,200,255,cv.THRESH_BINARY_INV)
logo1=cv.bitwise_and(logo,logo,mask=mask2)
# cv.imshow("logo1",logo1)#用饱和运算进行融合
roi[:]=cv.add(img1,logo1)
cv.imshow("img",img)
cv.imshow("roi",roi)cv.waitKey(0)
cv.destroyAllWindows()

此处的roi区域是在左上角,也可以是图像的其他位置,得到起始左上角点的坐标,然后切片,例如要从中间切(200,150),那么roi = img [200:200+w ,150:150+h]

八、图像噪点消除

        噪声:要了解图像噪点消除,就要先了解一下什么是图像噪声:想象你拍了一张照片,照片上出现了很多密密麻麻的 “小斑点” 或 “杂色”—— 这些就是图像噪声。

        常见的噪声包括:

        椒盐噪声:图像中随机出现的黑白斑点(像撒了盐和胡椒)

        高斯噪声:图像整体蒙上一层 “颗粒感”,噪声值符合高斯分布(中间多、两边少的正态分布),看起来像模糊的雪花

        松柏噪声:噪声强度和图像亮度相关,亮区域噪声更明显,类似 “光斑

        滤波器:也可以叫做卷积核。专门用来处理这些噪声的工具,通过特定规则 “调整像素值”,比如让噪声区域的像素值和周围正常像素 “平均一下”,从而减弱噪声的视觉效果。滤波器本身是一个小的区域,有着特定的核值,并且工作原理也是在原图上进行滑动并计算中心像素点的像素值

        滤波器可以分为:

  • 线性滤波:线性滤波对邻域中的像素进行线性运算,如在核的范围内进行加权求和,只是核卷积核的值不同。包括:
    • 均值滤波
    • 方框滤波
    • 高斯滤波
  • 非线性滤波:利用原始图像与模板之间的一种逻辑关系得到结果
    • 中值滤波
    • 双边滤波

滤波与模糊联系与区别:

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

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

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

(一)均值滤波

均值滤波是一种线性滤波方法,它基于简单的平均思想。

        原理:

        对于图像中的每一个像素点,选取其周围一定大小的邻域(通常是以该像素为中心的矩形区域,如 3×3、5×5 等,也就是我们所说的卷积核)

        然后计算这个邻域内所有像素的灰度值(对于灰度图像)或颜色值(对于彩色图像)的平均值,对于边界像素点则会进行边界填充

        最后将这个平均值赋给当前像素点,以此来替代原像素值,达到滤波的效果

        例如,对于一个 3×3 邻域的灰度图像,设 9 个像素的灰度值分别为 g1,g2,...g9,则滤波后中心像素的新灰度值 G 为:

        代码API:

#均值滤波,默认使用的是边缘反射101进行边缘填充
dst1=cv.blur(lvbo2,(3,3))

适用场景
适用于去除图像中的高斯噪声,当噪声相对均匀地分布在图像上时,均值滤波可以通过平均像素值来弱化噪声的影响。不过,它的缺点是容易使图像的边缘变得模糊,因为在计算平均值时,边缘像素也会和周围非边缘像素进行平均,从而损失了边缘的锐度,所以不太适合对边缘要求保留较好的图像去噪场景

(二)方框滤波

        原理:

方框滤波的原理和均值滤波类似,也是基于邻域内像素的平均计算。

        选取图像中像素的某个邻域,然后计算该邻域内像素值的总和

        根据设定的归一化参数决定是否除以邻域的像素个数(即是否进行平均),如果进行了归一化操作(除以邻域像素个数),那么它在数学计算上就等同于均值滤波;如果不进行归一化,滤波后像素的值可能会超出图像像素值原本的范围

        最后将得到的值赋给中心像素

        代码API:

#方框滤波 cv.boxfilter(src, ddepth, ksize[, anchor[, normalize[, borderType]]])
dst2=cv.boxFilter(lvbo2,-1,(3,3))
  • ksize:代表卷积核的大小,eg:ksize=3,则代表使用3×3的卷积核。

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

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

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

适用场景
当需要快速对图像进行平滑处理,且对像素值范围变化有一定的可控性要求时可以使用。比如在一些简单的图像预处理阶段,对图像的整体平滑程度要求不是特别高,且后续处理能够适应可能出现的像素值范围变化情况时适用。不过由于其容易造成图像模糊以及像素值范围改变的问题(若不进行归一化),使用场景相对有限

(三)高斯滤波

高斯滤波是一种加权平均的线性滤波方法,它基于高斯函数(正态分布函数)来确定邻域内各像素的权重

        原理

        对于图像中的每个像素,同样选取其周围的邻域(如 3×3、5×5 等),但不同位置的像素在计算平均时所占的权重不一样,距离中心像素越近的像素,其权重越大,距离越远权重越小,权重的具体值由高斯函数计算得出

        例如,对于一个二维的高斯函数其中 x、y 表示邻域内像素相对于中心像素的坐标位置,\(\sigma\) 是标准差,决定了高斯函数的 “胖瘦”,也就是权重分布的范围)

        通过该函数计算出邻域内每个像素的权重后,再将各像素值与对应权重相乘并求和,最后除以权重总和得到中心像素的新值

        代码示例:

#高斯滤波 cv.GaussianBlur(src, ksize,sigmaX[, dst[, sigmaY[, borderType]]])(sigmaX值越大模糊效果越明显)
dst3=cv.GaussianBlur(lvbo2,(7,7),0)

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

sigmaX:就是高斯函数里的值,σx值越大,模糊效果越明显。高斯滤波相比均值滤波效率要慢,但可以有效消除高斯噪声,能保留更多的图像细节,所以经常被称为最有用的滤波器。0表示标准差自动根据滤波器大小计算

适用场景
非常适合去除图像中的高斯噪声,因为它的加权平均特性使得滤波后的图像在平滑噪声的同时,相比均值滤波能够更好地保留图像的边缘和细节信息,使图像看起来更加自然。广泛应用于各种需要去噪同时又要尽量维持图像原有清晰度和细节的图像处理任务中,比如在计算机视觉的目标识别、图像分类等任务前对图像进行预处理去噪

(四)中值滤波

中值滤波是一种非线性滤波方法

        原理:

        对于图像中的每一个像素点,选取其周围一定大小的邻域(如 3×3、5×5 等),然后将这个邻域内所有像素的灰度值(或颜色值)进行排序,取排序后的中间值作为当前像素点的新值

        例如,对于一个 3×3 邻域内的像素灰度值分别为g1,g2,g3...g9(已从小到大排序),那么滤波后中心像素的新灰度值就是 \(g_5\)(第 5 个值,即中间值)这种方法的核心在于它不是通过平均来改变像素值,而是基于像素值的统计排序特性来去除噪声

        代码:

#中值滤波 cv.medianBlur(src, ksize)
dst4=cv.medianBlur(lvbo3,9)

适用场景
中值滤波对椒盐噪声(图像中随机出现的黑白斑点噪声)有很好的抑制效果。因为椒盐噪声通常是个别像素的异常值,通过取中值的方式可以有效地将这些异常值替换掉,而且它不会像均值滤波那样容易模糊图像的边缘,所以在对图像边缘清晰度要求较高,同时又要去除椒盐噪声的场景下非常适用,比如在医学图像、文字图像等需要保持清晰结构的图像处理中应用较多

(五)双边滤波

双边滤波综合考虑了空间距离和像素值差异(颜色差异)两个因素来确定滤波权重

        原理:

        针对图像中的每个像素选取一定大小的邻域,对于邻域内的每个像素

                一方面根据像素与中心像素的空间距离来确定一个空间权重(类似高斯滤波中基于距离的权重,距离越近权重越大),

                另一方面根据像素与中心像素的像素值差异(颜色差异)来确定一个灰度权重(像素值差异越小,灰度权重越大)

        然后将这两个权重相乘得到综合权重

        最后用综合权重对邻域内像素进行加权平均计算,得到中心像素的新值

        代码:

#双边滤波 cv.bilateralFilter(src, d, sigmaColor, sigmaSpace[, dst[, borderType]])
dst5 = cv.bilateralFilter(lvbo2, 9, 60, 60)
​
  • ksize:卷积核的大小

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

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

  • 适用场景:适用于需要在去除噪声的同时尽可能保留图像边缘和细节的场景,例如在对人像照片进行磨皮处理时,既能平滑皮肤部分的微小瑕疵(类似噪声),又能很好地保留五官等边缘轮廓清晰;在一些对图像质量要求较高,希望在降噪后图像依然具有丰富细节和清晰结构的计算机视觉任务、图像编辑等领域应用广泛。

五种滤波使用的代码:

import cv2 as cv
#窗口中文报错修复lvbo2=cv.imread('../images/lvbo2.png')
lvbo3=cv.imread('../images/lvbo3.png')#均值滤波,默认使用的是边缘反射101进行边缘填充
dst1=cv.blur(lvbo2,(3,3))#方框滤波 cv.boxfilter(src, ddepth, ksize[, anchor[, normalize[, borderType]]])
dst2=cv.boxFilter(lvbo2,-1,(3,3))#高斯滤波 cv.GaussianBlur(src, ksize,sigmaX[, dst[, sigmaY[, borderType]]])(sigmaX值越大模糊效果越明显)
dst3=cv.GaussianBlur(lvbo2,(7,7),0)#中值滤波 cv.medianBlur(src, ksize)
dst4=cv.medianBlur(lvbo3,9)#双边滤波 cv.bilateralFilter(src, d, sigmaColor, sigmaSpace[, dst[, borderType]])
dst5 = cv.bilateralFilter(lvbo2, 9, 60, 60)cv.imshow('lvbo2',lvbo2)
cv.imshow('lvbo3',lvbo3)
# cv.imshow('dst1',dst1)
# cv.imshow('dst2',dst2)
cv.imshow('dst3',dst3)
cv.imshow('dst4',dst4)
cv.imshow('dst5',dst5)cv.waitKey(0)
cv.destroyAllWindows()

http://www.xdnf.cn/news/16414.html

相关文章:

  • 九联UNT413AS_晶晨S905L3S芯片_2+8G_安卓9.0_线刷固件包
  • 蓝光中的愧疚
  • MySQL索引背后的B+树奥秘
  • Power Compiler:漏电功耗、内部功耗、切换功耗及其计算方式(NLPM)
  • 网络安全-机遇与挑战
  • 【内网穿透】使用FRP实现内网与公网Linux/Ubuntu服务器穿透项目部署多项目穿透方案
  • 在幸狐RV1106板子上用gcc14.2本地编译安装ssh客户端/服务器、vim编辑器、sl和vsftpd服务器
  • Apache Ranger 权限管理
  • 【优选算法】链表
  • 局域网 IP地址
  • 卡尔曼滤波器噪声方差设置对性能影响的仿真研究
  • 亚马逊广告策略:如何平衡大词和长尾词的效果?
  • JAVA_FIFTEEN_异常
  • 轮盘赌算法
  • CMake进阶: 检查函数/符号存在性、检查类型/关键字/表达式有效性和检查编译器特性
  • LeetCode 127:单词接龙
  • 中国开源Qwen3 Coder与Kimi K2哪个最适合编程
  • React性能优化终极指南:memo、useCallback、useMemo全解析
  • 【氮化镓】GaN取代GaAs作为空间激光无线能量传输光伏转换器材料
  • k8s下springboot-admin 监控服务部署,客户端接入
  • c++文件操作详解
  • C++ - 模板进阶
  • 浅谈生成式AI语言模型的现状与展望
  • 自然语言处理技术应用领域深度解析:从理论到实践的全面探索
  • 【STM32】CUBEMX下FreeRTOS 任务栈管理与栈溢出检测(CMSIS_V2接口)
  • 【深入探究系列(6)】算法设计:高效算法的实现与优化
  • 机器学习 KNN 算法,鸢尾花案例
  • DP4871音频放大芯片3W功率单通道AB类立体声/音频放大器
  • Python day24
  • 残月头像阁