OpenCV 作为 Python 计算机视觉领域的核心库其基础操作是入门计算机视觉的必经之路。本文将围绕边界填充、图像运算、阈值处理、图像平滑四大核心模块结合实战代码拆解原理与应用帮助新手快速掌握 OpenCV 图像预处理的核心逻辑。一、环境准备1. 依赖安装确保已安装 OpenCV 和 NumPy 库执行以下命令完成安装pip install opencv-python numpy2. 素材准备准备 1-2 张测试图片如zx_min.jpg、lp.png放置在代码同级目录下建议选择彩色、分辨率适中的图片便于观察处理效果。二、核心操作详解一边界填充给图像添加自定义边框边界填充Padding是图像预处理的基础操作常用于卷积运算中边缘信息补全、图像可视化时的边框美化等场景OpenCV 中通过cv2.copyMakeBorder()实现。1. 函数核心参数cv2.copyMakeBorder(src, top, bottom, left, right, borderType, value)参数说明src待填充的原始图像top/bottom/left/right上 / 下 / 左 / 右四个方向的边框宽度单位像素borderType边框类型核心5 种预设类型value仅BORDER_CONSTANT类型需要指定边框颜色BGR 格式如 (299,25,80)2. 5 种边框类型对比边框类型填充规则效果示例以序列 abcdefgh 为例BORDER_CONSTANT固定颜色填充 自定义颜色abcdefgh自定义颜色 BORDER_REFLECT镜面反射包含边界像素重复gfedcbaabcdefghhgfedcbaBORDER_REFLECT101镜面反射无边界重复推荐gfedcbabcdefghgfedcbBORDER_REPLICATE重复边界像素aaaaaaabcdefghhhhhhhhBORDER_WRAP循环填充上下左右边界互替cdefghabcdefghabcdefg3. 实战代码----------------边界填充------------------------- # cv2.copyMakeBorder()是OpenCV库中的一个函数用于给图像添加额外的边界(padding)。 # copyMakeBorder(src: UMat, top: int, bottom: int, left: int, right: int, borderType: int, dst: UMat | None ..., value: cv2.typing.Scalar ...) # 它有以下几个参数 # src:要扩充边界的原始图像。 # top, bottom, left, right:相应方向上的边框宽度。 # borderType:定义要添加边框的类型它可以是以下的一种 # cv2.BORDER_CONSTANT:添加的边界框像素值为常数(需要额外再给定一个参数)。 # cv2.BORDER_REFLECT:添加的边框像素将是边界元素的镜面反射类似于gfedcba|abcdefgh|hgfedcba。 (交界处也复制了 # cv2.BORDER_REFLECT_101 或 cv2.BORDER_DEFAULT和上面类似但是有一些细微的不同类似于gfedcb|abcdefgh|gfedcba (交接处删除了 # cv2.BORDER_REPLICATE使用最边界的像素值代替类似于aaaaaa|abcdefgh|hhhhhhh # cv2.BORDER_WRAP上下左右边依次替换cdefgh|abcdefgh|abcdefg import cv2 zmcv2.imread(zx_min.jpg) # zmcv2.resize(zm,dsizeNone,fx0.5,fy0.5) # zmcv2.resize(zm,(640,480)) top,bottom,left,right50,50,50,50 consantcv2.copyMakeBorder(zm,top,bottom,left,right,borderTypecv2.BORDER_CONSTANT,value(299,25,80)) reflectcv2.copyMakeBorder(zm,top,bottom,left,right,borderTypecv2.BORDER_REFLECT) reflect101cv2.copyMakeBorder(zm,top,bottom,left,right,borderTypecv2.BORDER_REFLECT101) replicatecv2.copyMakeBorder(zm,top,bottom,left,right,borderTypecv2.BORDER_REPLICATE) wrapcv2.copyMakeBorder(zm,top,bottom,left,right,borderTypecv2.BORDER_WRAP) cv2.imshow(zx_min,zm) # cv2.waitKey(0) cv2.imshow(CONSTANT,consant) # cv2.waitKey(0) cv2.imshow(REFLECT,reflect) # cv2.waitKey(0) cv2.imshow(REFLECT101,reflect101) # cv2.waitKey(0) cv2.imshow(REPLICATE,replicate) # cv2.waitKey(0) cv2.imshow(WRAP,wrap) cv2.waitKey(0) cv2.destroyAllWindows()二图像运算像素级加法与加权融合图像运算的本质是对像素值的逐点计算核心分为普通加法和加权加法适用于图像融合、亮度调节等场景。1. 普通加法两种规则的差异运算方式核心规则代码示例原生号超过 255 取余(ab)%256易导致颜色失真c a[区域] b[区域]cv2.add()超过 255 取 255饱和加法符合人眼视觉习惯c cv2.add(a, b)注意加法运算要求两张图像尺寸、通道数完全一致需先用 cv2.resize() 统一尺寸。2. 加权加法图像融合的核心加权加法通过 cv2.addWeighted() 实现支持调节图像透明度公式为• alpha/beta两张图像的权重通常和为 1如 0.50.5• gamma亮度调节常量可正可负如 10 表示整体亮度 10。实战代码-----------------图像运算----------------------- # 图像加法运算 # 对于号运算当对图像a图像b进行加法求和时遵循以下规则 # 当某位置像素相加得到的数值小于255时该位置数值为两图像该位置像素相加之和 # 当某位置像素相加得到的数值大于255时该位置数值将截断结果并将其减去 256 例如相加后是260实际是260-256 4 a cv2.imread(lp.png) b cv2.imread(zx_min.jpg) # 3. 对图片a的所有像素值加10像素级加法遵循模256规则 # 原理每个像素的B/G/R三个通道值都10比如像素(100,150,200)→(110,160,210)若加完超255则取余如(250,250,250)10→(4,4,4) c a 10 cv2.imshow(yuan, a) cv2.imshow(a10, c) cv2.waitKey(0) # 7. 截取图片a和b的指定区域并逐像素相加 # a[50:450,50:400]截取a的行50到449、列50到399的矩形区域高400像素宽350像素 # b[50:450,50:400]截取b的相同位置区域要求b的尺寸≥450行×400列否则报错 # 加法规则对应位置的像素值相加超255则取余如25010260→260-2564 c a[50:450,50:400] b[50:450,50:400] cv2.imshow(ab, c) cv2.waitKey(0) # 对于cv2.add()运算当对图像a图像b进行加法求和时遵循以下规则: # 当某位置像素相加得到的数值小于255时该位置数值为两图像该位置像素相加之和 #当某位置像素相加得到的数值大于255时该位置数值为255 # # 图像加权运算 #就是在计算两幅图像的像素值之和时将每幅图像的权重考虑进来可以用公式表示dstsrc1xasrc2xBV import cv2 a cv2.imread(lp.png) b cv2.imread(zx_min.jpg) # 3. 将图片b缩放为 400x400 像素宽400高400 # cv2.resize(待缩放图像, (目标宽度, 目标高度))统一尺寸是像素运算的前提 b cv2.resize(b, (400, 400)) # 4. 将图片a也缩放为 400x400 像素保证和b尺寸完全一致 # cv2.addWeighted要求两张图像尺寸、通道数必须相同否则报错 a cv2.resize(a, (400, 400)) # 5. 图像加权融合核心函数cv2.addWeighted # 公式c a*0.5 b*0.5 10 # 参数说明 # a第一张输入图像 # 0.5a的权重表示a占融合结果的50%透明度 # b第二张输入图像 # 0.5b的权重表示b占融合结果的50%透明度 # 10亮度调节常量给所有像素值加10整体提亮可正可负 c cv2.addWeighted(a, 0.5, b, 0.5, 10) cv2.imshow(addWeighted, c) cv2.waitKey(0) cv2.destroyAllWindows()三阈值处理图像二值化的核心阈值处理是将灰度图像转为黑白二值图的关键操作通过设定 “像素分界线”阈值区分前景与背景核心函数为 cv2.threshold()。1. 函数核心参数ret, dst cv2.threshold(src, thresh, maxval, type)thresh阈值0-255如 150maxval最大值通常为 255代表纯白type阈值处理类型5 种核心类型。2. 5 种阈值类型规则以阈值 150 为例类型处理规则视觉效果THRESH_BINARY≥150 → 255白150 → 0黑亮区变白暗区变黑THRESH_BINARY_INV≥150 → 0黑150 → 255白亮区变黑暗区变白THRESH_TRUNC≥150 → 150截断150 → 原值亮区 “封顶”暗区不变THRESH_TOZERO≥150 → 原值150 → 0黑亮区保留暗区变黑THRESH_TOZERO_INV≥150 → 0黑150 → 原值亮区变黑暗区保留3. 实战代码import cv2 import cv2 # 读取图片并转为灰度图参数0指定灰度模式像素值范围0-255 image cv2.imread(lpp.png, 0) # 阈值处理核心参数阈值150最大值255纯白 # 1. 二值化≥150→255(白)150→0(黑) | ret返回实际使用的阈值此处为150 ret, binary cv2.threshold(image, 150, 255, cv2.THRESH_BINARY) # 2. 反向二值化≥150→0(黑)150→255(白) ret1, binaryinv cv2.threshold(image, 150, 255, cv2.THRESH_BINARY_INV) # 3. 截断处理≥150→150(封顶)150→保留原值 ret2, trunc cv2.threshold(image, 150, 255, cv2.THRESH_TRUNC) # 4. 低于阈值置0≥150→保留原值150→0(黑) ret3, tozero cv2.threshold(image, 150, 255, cv2.THRESH_TOZERO) # 5. 高于阈值置0≥150→0(黑)150→保留原值 ret4, tozeroinv cv2.threshold(image, 150, 255, cv2.THRESH_TOZERO_INV) # 显示所有处理结果一次性展示按任意键关闭所有窗口 cv2.imshow(gray, image) # 灰度原图 cv2.imshow(binary, binary) # 二值化结果 cv2.imshow(binaryinv, binaryinv) # 反向二值化 cv2.imshow(trunc, trunc) # 截断效果 cv2.imshow(tozero, tozero) # 低于阈值置0 cv2.imshow(tozeroinv, tozeroinv) # 高于阈值置0 cv2.waitKey(0) # 阻塞窗口按任意键退出四图像平滑噪声去除的核心手段图像平滑模糊处理通过消除噪声、弱化细节实现图像模糊常用滤波器包括均值滤波、方框滤波、高斯滤波、中值滤波以下先实现 “添加椒盐噪声” 模拟真实场景再演示滤波效果。1. 生成椒盐噪声模拟图像噪声import cv2 import numpy as np # 定义添加椒盐噪声的函数 def add_peppersalt_noise(image, n10000): result image.copy() # 避免修改原图 h, w image.shape[:2] # 对于彩色图像默认 BGR 格式image.shape 返回 (高度, 宽度, 通道数)例如 (720, 1080, 3)对于灰度图像单通道image.shape 返回 (高度, 宽度)例如 (720, 1080)获取图像高、宽 for i in range(n): # 随机生成噪声点坐标 x np.random.randint(0, h) y np.random.randint(0, w) # 随机生成黑色0或白色255噪声 result[x, y] 0 if np.random.randint(0,2)0 else 255 return result # 读取图像并添加噪声 image cv2.imread(zx_min.jpg) noise_image add_peppersalt_noise(image) # 显示原图与噪声图 cv2.imshow(原图, image) cv2.imshow(椒盐噪声图, noise_image)2. 常用滤波器实战# 1. 均值滤波邻域平均核越大越模糊 blur_3 cv2.blur(noise_image, (3,3)) # 3x3 核轻度模糊 blur_63 cv2.blur(noise_image, (63,63)) # 63x63 核重度模糊 cv2.imshow(均值滤波 3x3, blur_3) cv2.imshow(均值滤波 63x63, blur_63) # 2. 方框滤波可归一化/非归一化 # normalizeTrue等价于均值滤波False像素值求和易过曝 一、核心结论 cv2.boxFilter() 中 normalizeTrue/False 决定了是否对滤波后的像素值进行归一化均值化是方框滤波的核心参数直接影响滤波效果 normalizeTrue归一化默认→ 等价于均值滤波滤波后图像亮度正常 normalizeFalse不归一化 → 像素值直接求和大概率溢出255图像整体偏白 / 过曝。 二、原理拆解3×3 核为例 1. 方框滤波的本质 方框滤波是对图像中每个像素的「邻域核大小内所有像素值求和」再根据 normalize 参数决定是否除以邻域像素总数 邻域像素总数 核的宽 × 核的高3×3 核 9 个像素 normalizeTrue归一化 计算公式目标像素值邻域像素总数/邻域内所有像素值之和 例3×3 邻域像素和为 1000 → 目标值 1000/9 ≈ 111正常范围 0-255 • 效果和 cv2.blur(noise, (3,3)) 完全一致是常规的 “均值模糊”图像亮度自然。 normalizeFalse不归一化 计算公式目标像素值 例3×3 邻域像素和为 1000 → 目标值 1000远超 255 关键OpenCV 中图像像素值默认是 uint8 类型0-255超过 255 的部分会被截断为 255饱和处理 效果大部分像素值直接溢出为 255图像呈现大面积白色过曝仅极少数暗区域可能保留细节。 box_norm cv2.boxFilter(noise_image, -1, (3,3), normalizeTrue) box_unnorm cv2.boxFilter(noise_image, -1, (3,3), normalizeFalse) cv2.imshow(方框滤波归一化, box_norm) cv2.imshow(方框滤波非归一化, box_unnorm) # 3. 高斯滤波高斯权重模糊更自然 gaussian cv2.GaussianBlur(noise_image, (3,3), 1) cv2.imshow(高斯滤波 3x3, gaussian) # 4. 中值滤波专治椒盐噪声 median cv2.medianBlur(noise_image, 3) # 核大小为奇数 cv2.imshow(中值滤波 3x3, median) cv2.waitKey(0) cv2.destroyAllWindows()3. 滤波器效果对比滤波器核心特点最佳适用场景均值滤波简单平均模糊均匀轻度降噪、整体模糊方框滤波可选择是否归一化自定义权重求和、特殊效果高斯滤波高斯权重边缘更柔和自然模糊、保留边缘的降噪中值滤波取邻域中值无像素求和椒盐噪声去除效果最佳三、核心总结边界填充BORDER_REFLECT101是卷积操作补边的首选BORDER_CONSTANT适合自定义颜色边框图像运算cv2.add()优于原生号addWeighted()是图像融合的核心函数阈值处理二值化是图像分割基础阈值需根据图像亮度灵活调整建议 120-180 之间调试图像平滑中值滤波对椒盐噪声效果最佳高斯滤波模糊更自然滤波核越大效果越明显需为奇数。四、注意事项所有操作前需校验图像读取是否成功if image is None避免路径错误导致报错像素运算、滤波等操作需保证图像尺寸 / 通道数一致必要时用cv2.resize()统一阈值处理建议先转为灰度图彩色图需分通道处理显示图像后需调用cv2.waitKey(0)阻塞窗口最后用cv2.destroyAllWindows()释放资源。