OpenCV 作为计算机视觉领域最经典、应用最广泛的开源库,其核心价值在于将复杂的图像处理逻辑封装为简洁易用的 API,让开发者无需深入底层算法,就能高效完成图像增强、特征提取、噪声处理等核心任务。
在实际开发中,图像边界处理、算术运算、阈值分割、噪声与滤波这些是贯穿图像处理全流程的四大基础模块 ------ 从图像预处理时的边界填充、像素值校准,到特征提取前的噪声去除、目标区域分割,这些方法几乎是所有计算机视觉的必要方法。
一、图像基础操作
图像基础操作是所有处理的起点,涵盖图像的读取、缩放、显示等核心动作。
python
import cv2
import numpy as np
# 1. 读取图像
img_color = cv2.imread("bizhi.jpg") # 彩色模式
img_gray = cv2.imread("bizhi.jpg", flags=0) # 灰度模式
# 2. 图像缩放
img_resize1 = cv2.resize(img_color, dsize=(640, 480)) # 固定尺寸
img_resize2 = cv2.resize(img_color, dsize=None, fx=0.5, fy=0.5) # 按比例缩放
# 3. 显示图像
cv2.imshow("color", img_color)
cv2.imshow("gray", img_gray)
cv2.imshow("resize1", img_resize1)
cv2.waitKey(0)
cv2.destroyAllWindows()
cv2.imread()表示读取图像,默认为彩色,当flags=0为灰度模式,返回 NumPy 数组格式的图像数据。
cv2.resize()图像缩放可按比例缩放(fx/fy)或固定尺寸缩放(dsize参数),如cv2.resize(img, (640, 480))
cv2.imshow()
cv2.waitKey()
cv2.destroyAllWindows()
其中imshow()创建显示窗口,waitKey(0)表示等待按键输入,0表示一直等待,destroyAllWindows()关闭所有窗口

二、图像边界处理
图像边界处理常用于卷积操作补边、图像拼接、视觉美化等场景,cv2.copyMakeBorder()是核心方法。
python
import cv2
import numpy as np
img = cv2.imread("bizhi.jpg")
top, bottom, left, right = 50, 50, 50, 50
# 1. 黑色填充
img_const = cv2.copyMakeBorder(img, top, bottom, left, right, cv2.BORDER_CONSTANT, value=(0,0,0))
# 2. 镜像填充
img_reflect = cv2.copyMakeBorder(img, top, bottom, left, right, cv2.BORDER_REFLECT)
# 3. 边缘复制
img_replicate = cv2.copyMakeBorder(img, top, bottom, left, right, cv2.BORDER_REPLICATE)
cv2.imshow("const", img_const)
cv2.imshow("reflect", img_reflect)
cv2.imshow("replicate", img_replicate)
cv2.waitKey(0)
cv2.destroyAllWindows()
cv2.copyMakeBorder()表示图像填充,其中
1.BORDER_CONSTANT:固定颜色填充(需指定value参数)。
2.BORDER_REFLECT:镜像反射填充(如 abc→cbaabccba)。
-
BORDER_REPLICATE:边缘复制填充(如 abc→aaaabcccc)。
-
BORDER_WRAP:平铺填充(如 abc→abcabcabc)

三、图像算术运算
图像算术运算本质是像素值的逐元素计算,常用于图像融合、亮度调整等场景,需注意像素值溢出问题。
python
import cv2
import numpy as np
# 读取两张尺寸相同的图像
img1 = cv2.imread("bizhi.jpg")
img2 = cv2.imread("bizhi01.jpg")
# 1. 直接数组运算
img_add_direct = img1 + img2
# 2. OpenCV饱和加法
img_add_cv = cv2.add(img1, img2)
# 3. 加权融合
img_blend = cv2.addWeighted(img1, 0.5, img2, 0.5, 10)
# 显示对比
cv2.imshow("add_direct", img_add_direct)
cv2.imshow("add_cv", img_add_cv)
cv2.imshow("blend", img_blend)
cv2.waitKey(0)
cv2.destroyAllWindows()
1.直接数组运算(a + b),这种方法是逐像素加减,这种方法虽然语法简单,但像素值超过 255 时会取模(如 256→0),导致颜色失真
2.cv2.add()是饱和加法,这种方法可以自动处理溢出,超过 255 则固定为 255,低于 0 则固定为 0,保证色彩正常
3.cv2.addWeighted() 这种方法是图像加权融合,实现渐变混合效果,gamma 为亮度偏移量。

四、阈值分割
阈值分割是将图像分为前景和背景的核心方法,cv2.threshold()实现全局阈值处理,是图像二值化的基础。
python
import cv2
import numpy as np
# 读取灰度图(阈值处理需灰度图像)
img_gray = cv2.imread("bizhi.jpg", flags=0)
# 定义阈值和最大值
thresh = 127
maxval = 255
# 不同阈值类型对比
ret1, img_binary = cv2.threshold(img_gray, thresh, maxval, cv2.THRESH_BINARY)
ret2, img_binary_inv = cv2.threshold(img_gray, thresh, maxval, cv2.THRESH_BINARY_INV)
ret3, img_trunc = cv2.threshold(img_gray, thresh, maxval, cv2.THRESH_TRUNC)
ret4, img_tozero = cv2.threshold(img_gray, thresh, maxval, cv2.THRESH_TOZERO)
# 显示结果
cv2.imshow("gray", img_gray) #原图
cv2.imshow("binary", img_binary) #二值化
cv2.imshow("binary_inv", img_binary_inv) #反二值化
cv2.imshow("trunc", img_trunc) #截断
cv2.imshow("tozero", img_tozero) #置零
cv2.waitKey(0)
cv2.destroyAllWindows()
cv2.threshold()是全局阈值处理,
-
THRESH_BINARY:二值化
-
THRESH_BINARY_INV:反二值化
-
THRESH_TRUNC:截断
-
THRESH_TOZERO:置零
-
THRESH_TOZERO_INV:反置零

五、噪声与滤波
图像噪声是实际场景中常见问题,滤波是去除噪声的核心手段,不同滤波方法适用于不同类型的噪声。
python
import cv2
import numpy as np
# 1. 自定义噪声生成函数
def add_peppersalt_noise(image, noise_num=10000):
img_noise = image.copy()
h, w = image.shape[:2]
# 生成噪声点坐标
coords = [np.random.randint(0, i, noise_num) for i in [h, w]]
# 噪声:一半为白(255),一半为黑(0)
for x, y in zip(coords[0], coords[1]):
if np.random.rand() < 0.5:
img_noise[x, y] = 0 #噪声(黑)
else:
img_noise[x, y] = 255 # 噪声(白)
return img_noise
# 2. 生成含噪声图像
img = cv2.imread("bizhi.jpg", flags=0) # 灰度图
img_noise = add_peppersalt_noise(img)
# 3. 不同滤波方法对比
img_blur = cv2.blur(img_noise, (3,3)) # 均值滤波
img_box = cv2.boxFilter(img_noise, -1, (3,3)) # 方框滤波(归一化)
img_gaussian = cv2.GaussianBlur(img_noise, (3,3), 1) # 高斯滤波
img_median = cv2.medianBlur(img_noise, 3) # 中值滤波
# 显示结果
cv2.imshow("img", img)#原图
cv2.imshow("noise", img_noise)#噪声图
cv2.imshow("blur", img_blur)#均值滤波
cv2.imshow("gaussian", img_gaussian)#高斯滤波
cv2.imshow("median", img_median)#中值滤波
cv2.waitKey(0)
cv2.destroyAllWindows()
1.cv2.blur():均值滤波,基础去噪,计算邻域像素平均值,易模糊边缘。
2.cv2.boxFilter():方框滤波,可选择是否归一化,不归一化时易出现像素溢出,灵活度更高。
3.cv2.GaussianBlur():高斯滤波,按高斯权重计算邻域像素值,抑制高斯噪声,保留更多边缘信息。
4.cv2.medianBlur():中值滤波,取邻域像素中值,对噪声(黑白斑点)去噪效果最优。

学会以上五大模块的核心方法,即可应对大部分基础图像处理场景。