OpenCV图像处理操作:边缘填充、阈值处理与图像平滑处理

在这里插入图片描述

一、图像边缘填充技术

1.1 核心函数解析

cv2.copyMakeBorder()是OpenCV实现边界填充的核心函数,其完整语法如下:

cv2.copyMakeBorder(src, top, bottom, left, right, borderType[, dst[, value]])

参数说明表:

参数名称数据类型说明
srcMat输入图像
topint顶部填充像素数
bottomint底部填充像素数
leftint左侧填充像素数
rightint右侧填充像素数
borderTypeint填充类型标识符
valueScalar当使用BORDER_CONSTANT时的填充值

1.2 五种填充模式对比

通过示例代码展示不同填充效果:

import cv2

img = cv2.imread('input.jpg')
top, bottom, left, right = 50, 50, 50, 50

# 五种填充方式对比
constant = cv2.copyMakeBorder(img,top,bottom,left,right,borderType=cv2.BORDER_CONSTANT,value=(57,38,156))
reflect = cv2.copyMakeBorder(img,top,bottom,left,right,borderType=cv2.BORDER_REFLECT)
reflect101 = cv2.copyMakeBorder(img,top,bottom,left,right,borderType=cv2.BORDER_REFLECT101)
replicate = cv2.copyMakeBorder(img,top,bottom,left,right,borderType=cv2.BORDER_REPLICATE)
wrap = cv2.copyMakeBorder(img,top,bottom,left,right,borderType=cv2.BORDER_WRAP)

填充效果对比表:

填充类型示意图例适用场景
BORDER_CONSTANT某个颜色边框需要明确边界色时
BORDER_REFLECT镜像对称保持图像连续性
BORDER_REFLECT_101优化镜像消除接缝痕迹
BORDER_REPLICATE边缘复制简单快速填充
BORDER_WRAP平铺重复特殊纹理处理

在这里插入图片描述
在这里插入图片描述


二、图像阈值处理技术

2.1 阈值处理原理

通过设定临界值对像素进行分类,公式表示:

dst(x,y)={maxvalif src(x,y)>thresh0otherwise dst(x,y) = \begin{cases} maxval & \text{if } src(x,y) > thresh \\ 0 & \text{otherwise} \end{cases} dst(x,y)={maxval0if src(x,y)>threshotherwise

2.2 五种阈值模式详解

ret,binary = cv2.threshold(img,127,255,cv2.THRESH_BINARY)
ret1,binaryinv = cv2.threshold(img,127,255,cv2.THRESH_BINARY_INV)
ret2,trunc = cv2.threshold(img,127,255,cv2.THRESH_TRUNC)
ret3,tozero = cv2.threshold(img,127,255,cv2.THRESH_TOZERO)
ret4,tozeroinv = cv2.threshold(img,127,255,cv2.THRESH_TOZERO_INV)

阈值处理类型对照表:

类型标识符计算公式可视化效果
THRESH_BINARY0或maxval黑白分明
THRESH_BINARY_INV取反操作黑白反转
THRESH_TRUNC截断处理保留亮部
THRESH_TOZERO零化暗区增强对比
THRESH_TOZERO_INV反向零化突出暗部
  • 彩色图像与灰度图阈值处理的对比

在这里插入图片描述
在这里插入图片描述

2.3 参数选择建议

  • 阈值选择:建议使用直方图分析确定最佳阈值
  • 最大值设定:通常设置为255(8位图像)
  • 类型选择:
    • 文档扫描:THRESH_BINARY
    • 光照不均:THRESH_TOZERO
    • 噪声抑制:结合平滑处理

三、图像平滑处理技术

3.1 噪声类型与处理选择

常见噪声处理方案:

噪声类型推荐滤波器参数建议
高斯噪声高斯滤波σ=1.5
椒盐噪声中值滤波3x3核
均匀噪声均值滤波5x5核
周期噪声傅里叶变换-

3.2 四大滤波算法对比

添加椒盐噪声

def add_peppersalt_noise(image):
    result = img.copy()
    h , w = img.shape[:2]
    for i in range(10000):
        x = np.random.randint(1,h)
        y = np.random.randint(1,w)
        if np.random.randint(0,2) ==0:
            result[x,y]=0
        else:
            result[x,y]=255
    return result

在这里插入图片描述

均值滤波(邻域平均滤波)–> blur函数

均值滤波(Mean filtering):是指用当前像素点周围nxn个像素值的均值来代替当前像素值。边界点的处理可以扩展当前图像的周围像素点padding在这里插入图片描述

参数含义默认值是否需要更改
dst返回值
src需要处理的图像
ksize滤波核(卷积核)的大小
anchor锚点(-1, -1)一般无需更改
borderType边界样式一般无需更改

一般情况下,使用 dst = cv2.blur(src, ksize) 即可。

blur_1 = cv2.blur(noise,(3,3))
cv2.imshow('blur(3*3)',blur_1)
blur = cv2.blur(noise,(5,5))
cv2.imshow('blur(5*5)',blur)

在这里插入图片描述

方框滤波–> boxFilter函数

方框滤波:是指用当前像素点周围nxn个像素值的和来代替当前像素值。

参数含义默认值说明
dst返回值进行方框滤波后得到的处理结果
src需要处理的图像原始图像
ddepth处理结果图像的图像深度-1一般使用 -1 表示与原始图像使用相同的图像深度(可理解为数据类型)
ksize滤波核的大小指在滤波处理过程中所选择的邻域图像的高度和宽度
anchor锚点指对应哪个区域
normalize滤波时是否进行归一化- 当值为 True 时,归一化,用邻域像素值的和除以面积,此时方框滤波与均值滤波效果相同
- 当值为 False 时,不归一化,直接使用邻域像素值的和,和 > 255 时使用 255
borderType边界样式一般有默认情况,可按需使用
boxFilter_1 = cv2.boxFilter(noise,-1,(3,3),normalize = True)
cv2.imshow('boxFilter_1(3*3)',boxFilter_1)
boxFilter_1 = cv2.boxFilter(noise,-1,(5,5),normalize = True)
cv2.imshow('boxFilter_1(5*5)',boxFilter_1)
boxFilter_2 = cv2.boxFilter(noise,-1,(3,3),normalize = False)
cv2.imshow('boxFilter_2(3*3)',boxFilter_2)
boxFilter_2 = cv2.boxFilter(noise,-1,(5,5),normalize = False)
cv2.imshow('boxFilter_2(5*5)',boxFilter_2)

在这里插入图片描述
在这里插入图片描述

高斯滤波–>GaussianBlur函数

高斯滤波(Mean filtering):对整幅图像进行加权平均的过程,每一个像素点的值,都由其本身和邻域内的其他像素值经过加权平均后得到。
在这里插入图片描述
在这里插入图片描述

参数含义默认值说明
src输入图像通常是一个NumPy数组
ksize滤波器的大小是一个元组,表示在水平和垂直方向上的像素数量,如(5, 5)表示5x5的滤波器
sigmaXX轴方向上的标准差0值与滤波器大小相关,默认值为0表示没有高斯模糊
sigmaYY轴方向上的标准差0值与滤波器大小相关,默认值为0表示没有高斯模糊
dst输出图像None通常是一个NumPy数组,若为None,则会创建一个新数组存储结果
GaussianB = cv2.GaussianBlur(noise,(3,3),1) #标准差为1,标准正太分布。
cv2.imshow('GaussianBlura_x(3*3)',GaussianB)
GaussianB = cv2.GaussianBlur(noise,(5,5),1) #标准差为1,标准正太分布。
cv2.imshow('GaussianBlura_x(5*5)',GaussianB)
GaussianB_1 = cv2.GaussianBlur(noise,(3,3),2) #标准差为1,标准正太分布。
cv2.imshow('GaussianBlura_y(3*3)',GaussianB_1)
GaussianB_1 = cv2.GaussianBlur(noise,(5,5),3) #标准差为1,标准正太分布。
cv2.imshow('GaussianBlura_y(5*5)',GaussianB_1)

在这里插入图片描述

中值滤波–>medianBlur函数

中值滤波:会取当前像素点及其周围临近像素点(一共有奇数个像素点)的像素值,将这些像素值从小到大排序,然后将位于中间位置的像素值作为当前像素点的像素值。

参数含义默认值说明
src输入图像进行中值滤波操作的原始图像
ksize滤波器的大小是一个整数,代表水平和垂直方向上的像素数量,如 5 表示 5x5 的滤波器
dst输出图像None通常为 NumPy 数组,若为 None 则会创建新数组存储滤波结果
medianB = cv2.medianBlur(noise,3)
cv2.imshow('medianBlur(3*3)',medianB)
medianB_5 = cv2.medianBlur(noise,5)
cv2.imshow('medianBlur(5*5)',medianB_5)

在这里插入图片描述

滤波器性能对比:
滤波器类型时间复杂度保边能力去噪效果适用场景
均值滤波O(n)一般快速处理
方框滤波O(n)可调节特殊需求
高斯滤波O(n logn)良好优秀自然图像
中值滤波O(n logn)优秀极佳椒盐噪声

3.3 参数优化技巧

  1. 核尺寸选择:
    • 奇数尺寸(3x3, 5x5)
    • 越大越模糊,但计算量增加
  2. 高斯滤波σ值:
    • σ=0时自动计算
    • σ与核尺寸比例建议:σ = 0.3*((ksize-1)*0.5 - 1) + 0.8
  3. 中值滤波:
    • 最佳效果通常出现在3x3或5x5
    • 大尺寸计算成本指数级增长

四、综合应用实例

# 完整处理流程示例
def process_image(img_path):
    # 读取图像
    img = cv2.imread(img_path)
    
    # 边缘填充
    padded = cv2.copyMakeBorder(img, 20,20,20,20, cv2.BORDER_REFLECT101)
    
    # 灰度转换
    gray = cv2.cvtColor(padded, cv2.COLOR_BGR2GRAY)
    
    # 阈值处理
    _, thresh = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY+cv2.THRESH_OTSU)
    
    # 噪声去除
    denoised = cv2.medianBlur(thresh, 3)
    
    return denoised

该示例展示了:

  1. 反射边界填充保持图像连续性
  2. 自动阈值选择(OTSU算法)
  3. 中值滤波去除椒盐噪声
  4. 完整的预处理流程

五、性能优化建议

  1. 并行处理:对大图使用cv2.UMat加速
  2. 内存管理:及时释放不需要的图像缓存
  3. 硬件加速:启用OpenCL支持
  4. 算法选择:根据实时性要求选择滤波器
# 使用UMat加速示例
img_umat = cv2.UMat(img)
blur_umat = cv2.blur(img_umat, (5,5))
result = blur_umat.get()

六、常见问题解答

Q:边界填充后图像尺寸如何计算?
A:新尺寸 = 原始高+top+bottom × 原始宽+left+right

Q:中值滤波核大小是否影响去噪效果?
A:是的,过小的核无法去除密集噪声,过大的核会导致细节丢失

Q:阈值处理出现大量噪声怎么办?
A:建议先进行高斯滤波再进行阈值处理

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值