一、图片的边界填充
在 OpenCV 中,cv2.copyMakeBorder()是用于给图像添加边框(边缘)的核心 API,其完整语法和参数说明如下:
函数完整定义
cv2.copyMakeBorder(src, top, bottom, left, right, borderType, value=None)
参数详细说明
src:输入图像(numpy.ndarray类型),可以是单通道(灰度图)或多通道(如 RGB/BGR 彩色图)。
top:整数,指定图像顶部需要添加的边框像素数量。
bottom:整数,指定图像底部需要添加的边框像素数量。
left:整数,指定图像左侧需要添加的边框像素数量。
right:整数,指定图像右侧需要添加的边框像素数量。
borderType:边框填充方式的枚举值,决定了边框像素如何生成。OpenCV 支持以下类型:
-
cv2.BORDER_WRAP:外包装填充
边框像素从图像的对侧 “缠绕” 而来(类似平铺效果)。
例:原图边缘为[1,2,3,4],右侧边框可能填充[1,2](复用左侧内容)。 -
cv2.BORDER_REFLECT_101(或cv2.BORDER_DEFAULT):对称填充
与REFLECT类似,但反射以边缘像素为轴,包含边缘像素。
例:原图边缘为[1,2,3,4],填充后可能为[2,1,1,2,3,4,4,3](OpenCV 推荐默认使用此类型)。 -
cv2.BORDER_REFLECT:反射填充
边框像素是原图边缘的镜像反射,不包含边缘像素本身的重复。
例:原图边缘为[1,2,3,4],填充后可能为[3,2,1,2,3,4,3,2]。 -
cv2.BORDER_REPLICATE:复制填充
边框像素由原图最边缘的像素复制而来(如右侧边框复制原图最右列像素,顶部边框复制原图最上行像素)。 -
cv2.BORDER_CONSTANT:常数填充
边框像素使用指定的单一颜色填充,需配合value参数设置颜色(BGR 格式,如(255,0,0)表示蓝色)。
value:可选参数,仅当borderType=cv2.BORDER_CONSTANT时有效,指定边框的颜色值:
-
彩色图:BGR 三通道值(如(0,255,0)表示绿色)。
-
灰度图:单值(如128表示灰色)。
返回值
-
添加边框后的新图像(numpy.ndarray类型),尺寸为:
(src.shape[0] + top + bottom, src.shape[1] + left + right, src.shape[2])(彩色图)
或 (src.shape[0] + top + bottom, src.shape[1] + left + right)(灰度图)。
示例代码:
可以自选随便一张图片
# 导入OpenCV库
import cv2
# 读取图像文件,返回BGR格式的numpy数组
# 注意:如果图像路径错误,会返回None但不报错
ys = cv2.imread('mm.jpg')
# 调整图像尺寸:按比例缩小
# dsize=None表示不直接指定目标尺寸,而是通过fx和fy设置缩放比例
# fx=0.2表示宽度缩小为原来的20%,fy=0.2表示高度缩小为原来的20%
ys = cv2.resize(ys, dsize=None, fx=0.2, fy=0.2)
# 下面是另一种尺寸调整方式(被注释掉了)
# 直接指定目标尺寸为(640, 480),参数格式为(宽度, 高度)
# ys = cv2.resize(ys, (640, 480))
# 定义边界填充的尺寸:上下左右各填充50像素
# top: 顶部填充像素数,bottom: 底部填充像素数
# left: 左侧填充像素数,right: 右侧填充像素数
top, bottom, left, right = 50, 50, 50, 50
# 1. 常量边界填充(BORDER_CONSTANT)
# 使用指定的颜色填充边界,这里填充为(229,25,80)对应的粉红色
# 参数说明:原图像、上下左右填充量、边界类型、填充颜色
constant = cv2.copyMakeBorder(ys, top, bottom, left, right,
borderType=cv2.BORDER_CONSTANT,
value=(229,25,80))
# 2. 反射边界填充(BORDER_REFLECT)
# 以图像边缘为轴,对称反射填充像素(类似镜像)
# 例如原图像边缘像素为a,b,c,则填充为c,b,a,b,c,b,a…
reflect = cv2.copyMakeBorder(ys, top, bottom, left, right,
borderType=cv2.BORDER_REFLECT)
# 3. 反射101边界填充(BORDER_REFLECT101)
# 与REFLECT类似,但不重复边缘像素
# 例如原图像边缘像素为a,b,c,则填充为b,a,b,c,b,a…
reflect101 = cv2.copyMakeBorder(ys, top, bottom, left, right,
borderType=cv2.BORDER_REFLECT101)
# 4. 复制边界填充(BORDER_REPLICATE)
# 重复最边缘的像素进行填充
# 例如原图像边缘像素为a,b,c,则填充为c,c,c,c,c…
replicate = cv2.copyMakeBorder(ys, top, bottom, left, right,
borderType=cv2.BORDER_REPLICATE)
# 5. 环绕边界填充(BORDER_WRAP)
# 以图像对侧的内容填充边界(类似平铺效果)
# 例如右侧边界用左侧内容填充,底部边界用顶部内容填充
wrap = cv2.copyMakeBorder(ys, top, bottom, left, right,
borderType=cv2.BORDER_WRAP)
# 显示原始图像,窗口名为"1.yuantu"
cv2.imshow('1.yuantu', ys)
# cv2.waitKey(0) # 注释掉的等待按键,不启用时所有窗口会同时显示
# 显示常量填充效果
cv2.imshow('2.CONSTANT', constant)
# cv2.waitKey(0)
# 显示反射填充效果
cv2.imshow('3.REFLECT', reflect)
# cv2.waitKey(0)
# 显示反射101填充效果
cv2.imshow('4.REFLECT 101', reflect101)
# cv2.waitKey(0)
# 显示复制填充效果
cv2.imshow('5.REPLICATE', replicate)
# cv2.waitKey(0)
# 显示环绕填充效果
cv2.imshow('6.WRAP', wrap)
# 等待用户按键,0表示无限等待,按任意键后关闭所有窗口
cv2.waitKey(0)
二、图像的运算
1. 像素值加法(numpy 运算)
c = a + 10 # 对图像a的所有像素值加10
c = a[50:250, 50:200] + b[50:250, 50:200] # 对指定区域的像素相加
- 原理:基于 Numpy 数组的元素级运算,每个像素的 BGR 三个通道值分别参与运算
- 特点:属于模运算(溢出时取模),例如像素值250 + 10 = 260 → 260 % 256 = 4
- 限制:要求参与运算的图像区域尺寸完全相同(如a[50:250,50:200]与b[50:250,50:200]的宽高必须一致)
2. 图像加法(OpenCV 函数)
c = cv2.add(a, b)
- 功能:与a + b类似,但属于饱和运算(溢出时取最大值 255)
- 区别:
- a + b:模运算(250 + 10 = 4)
- cv2.add(a, b):饱和运算(250 + 10 = 255)
- 优势:更符合视觉预期,避免像素值溢出导致的异常颜色
3. 加权图像融合:cv2.addWeighted()
c = cv2.addWeighted(a, 0.5, b, 0.5, 10)
- 功能:按权重融合两张图像,公式为:
result = α×img1 + β×img2 + γ - 参数:
- a/b:输入图像(需尺寸和通道数相同)
- 0.5/0.5:权重α和β(总和可不为 1,控制两张图像的占比)
- 10:偏置项γ(对结果整体加一个常量,调整亮度)
- 应用场景:实现图像淡入淡出、叠加水印等效果
示例代码:
# 导入OpenCV库,cv2是OpenCV在Python中的别名
import cv2
# 读取图像文件,返回的是numpy数组(ndarray),默认读取为彩色图像(BGR格式)
# 注意:如果文件路径错误,会返回None但不报错
a = cv2.imread('flower_dog.jpg') # 读取第一张图像
b = cv2.imread('img.png') # 读取第二张图像
# 像素值运算:对图像a的所有像素点的每个通道值都加10
# 原理:numpy数组的元素级运算,属于模运算(超过255会取模,如250+10=260→260%256=4)
c = a + 10
# 创建窗口显示图像,第一个参数是窗口名称,第二个参数是要显示的图像
cv2.imshow('yuan', a) # 显示原始图像a,窗口名为"yuan"
cv2.imshow('a+10', c) # 显示像素值加10后的图像c,窗口名为"a+10"
# 等待键盘输入,参数0表示无限等待,直到用户按下任意键
# 必须配合imshow使用,否则窗口会一闪而逝
cv2.waitKey(0)
# 图像区域像素相加:对a和b的指定区域进行像素加法
# [50:250,50:200]表示裁剪图像的行范围50-250,列范围50-200(注意是高×宽)
# 要求两个区域的尺寸完全相同,否则会报错
c = a[50:250, 50:200] + b[50:250, 50:200]
cv2.imshow('a+b', c) # 显示区域相加的结果
# 重新读取图像(可能因为之前的操作修改了原图像数据)
a = cv2.imread('flower_dog.jpg')
b = cv2.imread('img.png')
# 调整图像尺寸:将a和b都调整为400×400像素
# 注意参数是(宽度, 高度),与图像数组的(高度,宽度)维度顺序相反
a = cv2.resize(a, (400, 400))
b = cv2.resize(b, (400, 400))
# OpenCV的图像加法函数:与a+b的区别是采用饱和运算(超过255则取255)
# 例如250+10=255而不是4,更符合视觉预期
c = cv2.add(a, b)
cv2.imshow('a,add,b', c) # 显示cv2.add的运算结果
cv2.waitKey(0) # 等待按键输入
cv2.destroyAllWindows() # 关闭所有OpenCV创建的窗口
# 再次读取图像,准备进行加权融合
a = cv2.imread('flower_dog.jpg')
b = cv2.imread('img.png')
# 统一图像尺寸,确保可以进行融合运算
a = cv2.resize(a, (400, 400))
b = cv2.resize(b, (400, 400))
# 图像加权融合:result = α*a + β*b + γ
# 参数说明:a和b是输入图像,0.5和0.5是权重,10是亮度调节值(偏置项)
# 公式:c = 0.5*a + 0.5*b + 10
c = cv2.addWeighted(a, 0.5, b, 0.5, 10)
cv2.imshow('addweighted', c) # 显示加权融合结果
cv2.waitKey(0) # 等待按键输入
cv2.destroyAllWindows() # 关闭所有窗口,释放资源
三、图像的阈值处理
1. cv2.THRESH_BINARY(二进制阈值)
核心逻辑:将图像像素值与阈值比较,大于阈值的像素设为最大值(通常为 255,白色),小于等于阈值的设为 0(黑色)。
数学表达式:
dst(x,y) = maxval, if src(x,y) > thresh
dst(x,y) = 0, otherwise
直观理解:非黑即白的二值化,直接将图像分为两个极端。
适用场景:
- 文档扫描(将文字与背景分离)
- 目标检测中提取轮廓(如二维码识别)
- 去除灰度图中灰度值较低的背景噪声
2. cv2.THRESH_BINARY_INV(反二进制阈值)
核心逻辑:与THRESH_BINARY完全相反,大于阈值的像素设为 0(黑色),小于等于阈值的设为最大值(255,白色)。
数学表达式:
dst(x,y) = 0, if src(x,y) > thresh
dst(x,y) = maxval, otherwise
直观理解:黑白反转的二值化,原来看起来亮的区域变暗,暗的区域变亮。
适用场景:
- 文字识别中需要 “黑底白字” 转 “白底黑字”
- 提取图像中较暗的目标(如夜景中的灯光)
- 修正光照不均导致的明暗颠倒问题
3. cv2.THRESH_TRUNC(截断阈值)
核心逻辑:像素值大于阈值时,强制设为阈值本身;小于等于阈值时,保持原像素值不变。
数学表达式:
dst(x,y) = thresh, if src(x,y) > thresh
dst(x,y) = src(x,y), otherwise
直观理解:“截断” 过亮的像素,将超过阈值的亮度 “压” 到阈值水平,保留暗部细节。
适用场景:
- 处理过曝图像(如强光导致的白色区域过大)
- 抑制高光区域(如人像摄影中过亮的皮肤)
- 保留图像暗部纹理,同时避免亮部过曝丢失信息
4. cv2.THRESH_TOZERO(归零阈值)
核心逻辑:像素值大于阈值时,保持原像素值;小于等于阈值时,设为 0(黑色)。
数学表达式:
dst(x,y) = src(x,y), if src(x,y) > thresh
dst(x,y) = 0, otherwise
直观理解:只保留亮度高于阈值的区域,低于阈值的区域直接 “归零”(变黑)。
适用场景:
- 提取图像中较亮的目标(如 X 光片中的高亮病变区域)
- 去除暗部噪声(如低光照下的图像噪点)
- 保留目标区域(通常较亮)并简化背景(变为黑色)
5. cv2.THRESH_TOZERO_INV(反归零阈值)
核心逻辑:与THRESH_TOZERO相反,像素值大于阈值时,设为 0(黑色);小于等于阈值时,保持原像素值。
数学表达式:
dst(x,y) = 0, if src(x,y) > thresh
dst(x,y) = src(x,y), otherwise
直观理解:只保留亮度低于阈值的区域,高于阈值的区域 “归零”(变黑)。
适用场景:
- 提取图像中较暗的目标(如夜景中的阴影区域)
- 去除高光干扰(如反光、光斑)
- 保留暗部细节,同时消除过亮区域的影响
总结:5 种阈值类型的核心差异
THRESH_BINARY | 设为 maxval(如 255) | 设为 0 | 亮区域保留,暗区域变黑 |
THRESH_BINARY_INV | 设为 0 | 设为 maxval(如 255) | 暗区域保留,亮区域变黑 |
THRESH_TRUNC | 设为阈值本身 | 保持原值 | 抑制过亮区域,保留暗部 |
THRESH_TOZERO | 保持原值 | 设为 0 | 保留亮区域,暗区域变黑 |
THRESH_TOZERO_INV | 设为 0 | 保持原值 | 保留暗区域,亮区域变黑 |
示例代码:
# 导入OpenCV库,OpenCV是一个用于计算机视觉的开源库
import cv2
# 读取图像文件,并转换为灰度图
# 参数说明:
# 'mm.jpg':图像文件路径(需与脚本同目录或使用绝对路径)
# 0:读取模式,0表示以灰度图模式读取(单通道)
image = cv2.imread('mm.jpg', 0)
# 调整图像尺寸为400×400像素
# 注意:resize函数的参数是(width, height),与图像通常的(height, width)格式相反
image = cv2.resize(image, (400, 400))
# 1. 二进制阈值处理
# 参数说明:
# image:输入的灰度图像
# 130:设定的阈值
# 255:最大值(用于THRESH_BINARY和THRESH_BINARY_INV类型)
# cv2.THRESH_BINARY:阈值类型,大于阈值的像素设为255,否则设为0
# 返回值:ret为使用的阈值,binary为处理后的图像
ret, binary = cv2.threshold(image, 130, 255, cv2.THRESH_BINARY)
# 2. 反二进制阈值处理
# cv2.THRESH_BINARY_INV:与BINARY相反,大于阈值的像素设为0,否则设为255
ret1, binaryInv = cv2.threshold(image, 130, 255, cv2.THRESH_BINARY_INV)
# 3. 截断阈值处理
# cv2.THRESH_TRUNC:大于阈值的像素设为阈值(130),否则保持原像素值
ret2, trunc = cv2.threshold(image, 130, 255, cv2.THRESH_TRUNC)
# 4. 归零阈值处理
# cv2.THRESH_TOZERO:大于阈值的像素保持原值,否则设为0
ret3, tozero = cv2.threshold(image, 130, 255, cv2.THRESH_TOZERO)
# 5. 反归零阈值处理
# cv2.THRESH_TOZERO_INV:与TOZERO相反,大于阈值的像素设为0,否则保持原值
ret4, tozeroInv = cv2.threshold(image, 130, 255, cv2.THRESH_TOZERO_INV)
# 显示原始灰度图像
# 参数:窗口名称('gray')和要显示的图像
cv2.imshow('gray', image)
# 显示二进制阈值处理后的图像
# 效果:像素值>130的区域变为白色(255),<=130的区域变为黑色(0)
cv2.imshow('binary', binary)
# 显示反二进制阈值处理后的图像
# 效果:像素值>130的区域变为黑色(0),<=130的区域变为白色(255)
cv2.imshow('binaryInv', binaryInv)
# 显示截断阈值处理后的图像
# 效果:像素值>130的区域变为130(灰色),<=130的区域保持原图亮度
cv2.imshow('trunc', trunc)
# 显示归零阈值处理后的图像
# 效果:像素值>130的区域保持原图亮度,<=130的区域变为黑色(0)
cv2.imshow('tozero', tozero)
# 显示反归零阈值处理后的图像
# 效果:像素值>130的区域变为黑色(0),<=130的区域保持原图亮度
cv2.imshow('tozeroInv', tozeroInv)
# 等待用户按键操作
# 参数0表示无限等待,直到用户按下任意键
# 所有窗口会在用户按键后关闭
cv2.waitKey(0)
四、图像的平滑处理
图像平滑(smoothing)也称为“模糊处理”(bluring)
通过消除图像中的噪声或细节来使图像看起来更为模糊,从而实现平滑效果
可以用来压制、弱化或消除图像中的细节、突变和噪声。
下面是常用的一些滤波器
均值滤波(邻域平均滤波)-> blur函数
方框滤波-> boxFilter函数
高斯滤波->GaussianBlur函数
中值滤波->medianBlur函数
dst=cv2.blur(src,ksize,anchor,borderType)
dst是返回值
src是需要处理的图像
ksize是滤波核(卷积核)的大小
anchor是锚点,默认值是(-1,-1)一般无需更改
borderType是边界样式,一般无需更改
一般情况下,使用dst=cv2.blur(src,ksize)即可
准备代码:
准备一个含有噪声点的图像来方便后面的演示
# 导入OpenCV库,用于图像处理
import cv2
# 导入numpy库,用于数值计算和随机数生成
import numpy as np
# 定义添加椒盐噪声的函数
# 参数:
# image: 原始图像
# n: 噪声点的数量,默认值为10000
def add_peppersalt_noize(image, n=10000):
# 复制原始图像,避免直接修改原图
result = image.copy()
# 获取图像的高度和宽度(shape[:2]取前两个值,即高度和宽度)
h, w = image.shape[:2]
# 循环n次,生成n个噪声点
for i in range(n):
# 随机生成x坐标(行),范围在1到h之间
x = np.random.randint(1, h)
# 随机生成y坐标(列),范围在1到w之间
y = np.random.randint(1, w)
# 随机生成0或1,决定是添加椒噪声(0)还是盐噪声(255)
if np.random.randint(0, 2) == 0:
# 添加椒噪声(黑色点)
result[x, y] = 0
else:
# 添加盐噪声(白色点)
result[x, y] = 255
# 返回添加噪声后的图像
return result
# 读取图像文件'mm.jpg',默认读取为BGR格式
image = cv2.imread('mm.jpg')
# 调整图像大小为400×400像素
image = cv2.resize(image, (400, 400))
# 创建一个窗口显示原始图像,窗口名为'mm'
cv2.imshow('mm', image)
# 调用函数为图像添加椒盐噪声
noise = add_peppersalt_noize(image)
# 创建一个窗口显示带噪声的图像,窗口名为'noise'
cv2.imshow('noise', noise)
# 等待用户按下任意键,参数0表示无限等待
cv2.waitKey(0)
# 关闭所有OpenCV创建的窗口(虽然代码中没写,但通常建议加上)
# cv2.destroyAllWindows()
1、均值滤波
cv2.blur() 是 OpenCV 中用于实现均值模糊(也称为归一化盒式滤波)的 API,其核心原理是用图像中某一像素周围邻域内所有像素的平均值来替代该像素的值,从而达到平滑图像、降低噪声的效果。
语法格式:
dst = cv2.blur(src, ksize[, anchor[, borderType]])
参数说明:
src(必选):
输入图像(源图像),可以是单通道灰度图或多通道彩色图(如 BGR 格式)。
ksize(必选):
模糊核(卷积核)的大小,格式为 (width, height),例如 (3,3) 表示使用 3×3 的正方形核。
核的尺寸越大,模糊效果越强,但图像细节损失也越多。
anchor(可选):
核的锚点(即计算均值时的参考点),默认值为 (-1,-1),表示锚点位于核的中心。
borderType(可选):
边界填充方式,用于处理图像边缘像素(因为边缘像素没有完整的邻域)。
默认值为 cv2.BORDER_DEFAULT,常用选项还包括 cv2.BORDER_CONSTANT(常量填充)、cv2.BORDER_REPLICATE(复制边缘像素填充)等。
示例代码(接上面的准备代码):
blur_1 = cv2.blur(noise,(3,3))#卷积核为(3,3)
cv2.imshow('bler_1',blur_1)
blur_2 = cv2.blur(noise,(9,9))#卷积核为(3,3)
cv2.imshow('bler_2',blur_2)
blur_3 = cv2.blur(noise,(15,15))#卷积核为(3,3)
cv2.imshow('bler_3',blur_3)
blur_4 = cv2.blur(noise,(21,21))#卷积核为(3,3)
cv2.imshow('bler_4',blur_4)
cv2.waitKey(0)
2、方框滤波
cv2.boxFilter() 是 OpenCV 中一个灵活的线性滤波函数,用于实现盒式滤波(Box Filter)。它可以看作是 cv2.blur() 的通用版本,既可以实现均值模糊(归一化盒式滤波),也可以实现非归一化的盒式滤波(仅对邻域像素求和)。
语法格式:
dst = cv2.boxFilter(src, ddepth, ksize[, anchor[, normalize[, borderType]]])
参数说明:
src(必选):
输入图像(源图像),可以是单通道灰度图或多通道彩色图。
ddepth(必选):
输出图像的深度(数据类型),常用值:
- cv2.CV_8U:8 位无符号整数(0-255)
- cv2.CV_32F:32 位浮点数
- -1:表示输出图像深度与输入图像相同(推荐使用)
ksize(必选):
滤波核(卷积核)的大小,格式为 (width, height),例如 (3,3) 表示 3×3 的核。
anchor(可选):
核的锚点(计算滤波时的参考点),默认值 (-1,-1) 表示锚点在核中心。
normalize(可选):
布尔值,是否对滤波结果进行归一化:
- True(默认):归一化盒式滤波,即邻域像素求和后除以核的面积(等价于 cv2.blur())。
- False:非归一化盒式滤波,仅计算邻域像素的总和(可能导致像素值溢出,需注意数据类型)。
borderType(可选):
边界填充方式,用于处理图像边缘像素,默认值为 cv2.BORDER_DEFAULT,其他常用选项同 cv2.blur()。
功能说明:
-
当 normalize=True 时,cv2.boxFilter() 与 cv2.blur() 效果完全一致,都是计算邻域像素的平均值:
dst(x,y) = (sum of src(x',y') in ksize) / (width×height) -
当 normalize=False 时,仅计算邻域像素的总和:
dst(x,y) = sum of src(x',y') in ksize
这种模式下,结果可能超过像素值范围(如 0-255),因此通常需要配合 ddepth=cv2.CV_32F 使用,避免溢出。
3、高斯滤波
cv2.GaussianBlur() 是 OpenCV 中用于实现高斯模糊的 API,其核心原理是使用高斯核(符合高斯分布的卷积核)对图像进行卷积操作,相比均值模糊能更好地保留图像细节,同时有效去除高斯噪声。
语法格式:
dst = cv2.GaussianBlur(src, ksize[, sigmaX[, sigmaY[, borderType]]])
参数说明:
src(必选):
输入图像(源图像),可以是单通道灰度图或多通道彩色图(如 BGR 格式)。
ksize(必选):
高斯核的大小,格式为 (width, height),需满足:
-
宽度和高度必须是正奇数(如 (3,3)、(5,5)、(7,7) 等)。
- 若宽度≠高度,核可以是矩形(如 (3,5)),但通常使用正方形核。
核的尺寸越大,模糊效果越强。
sigmaX(可选):
高斯核在 X 方向(水平方向)的标准差,控制高斯分布的 "宽窄":
- sigmaX > 0:使用指定值作为 X 方向标准差。
- sigmaX = 0(默认):根据核尺寸自动计算(sigma = 0.3×((ksize-1)×0.5 – 1) + 0.8)。
- sigmaX < 0:不合法,会报错。
sigmaY(可选):
高斯核在 Y 方向(垂直方向)的标准差:
- 若未指定或为 0:默认与 sigmaX 相等(各向同性高斯模糊)。
- 若 sigmaY > 0:可实现 X、Y 方向不同强度的模糊(各向异性)。
borderType(可选):
边界填充方式,处理图像边缘像素,默认值为 cv2.BORDER_DEFAULT,其他选项同 cv2.blur()。
示例代码(接上面的准备代码):
GaussianB = cv2.GaussianBlur(noise, ksize=(3,3), sigmaX=1) # 标准正态分布、3、3、高斯滤波
cv2.imshow(winname='GaussianBlur', mat=GaussianB)
cv2.waitKey(0)
4、中值滤波
cv2.medianBlur() 是 OpenCV 中用于实现中值滤波的 API,其核心原理是用图像中某一像素周围邻域内所有像素的中值来替代该像素的值。这种滤波方式对椒盐噪声(图像中随机出现的黑白点)有非常好的去除效果,同时能较好地保留图像边缘细节。
语法格式:
dst = cv2.medianBlur(src, ksize[, dst])
参数说明:
src(必选):
输入图像(源图像),可以是单通道灰度图或多通道彩色图(如 BGR 格式)。
注意:该函数仅支持 8 位单通道图像、16 位单通道图像(CV_16U)或 32 位浮点单通道图像(CV_32F)。对于多通道图像,会对每个通道分别进行中值滤波。
ksize(必选):
滤波核的大小,必须是大于 1 的正奇数(如 3、5、7 等),表示使用 ksize×ksize 的正方形核。
核的尺寸越大,去噪效果越强,但图像细节损失也可能越多。
dst(可选):
输出图像,与输入图像具有相同的尺寸和类型,通常不需要手动指定,函数会自动创建并返回。
功能原理:
中值滤波的计算过程:
例如,使用 3×3 核时,会对 9 个像素值排序,取第 5 个值(中间值)作为结果。
示例代码(接上面的准备代码):
medianB = cv2.medianBlur(noise, ksize=3) # 4、中值滤波
cv2.imshow(winname='medianBlur', mat=medianB)
cv2.waitKey(0)
cv2.destroyAllWindows()
评论前必须登录!
注册