OpenCV的核心图像处理方法——图像边界处理、图像算术运算、阈值分割、噪声与滤波

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)。

  1. BORDER_REPLICATE:边缘复制填充(如 abc→aaaabcccc)。

  2. 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()是全局阈值处理,

  1. THRESH_BINARY:二值化

  2. THRESH_BINARY_INV:反二值化

  3. THRESH_TRUNC:截断

  4. THRESH_TOZERO:置零

  5. 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():中值滤波,取邻域像素中值,对噪声(黑白斑点)去噪效果最优。

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

相关推荐
wenzhangli711 分钟前
AI-IDE 关键技术解析:从自然语言到企业级智能开发平台的架构演进
ide·人工智能·架构
百胜软件@百胜软件24 分钟前
从“数据孤岛”到“智利标杆”:百胜E3全渠道中台助力“名创优品”Newtree实现一体化智变
大数据·人工智能·零售数字化·数智中台·珠宝行业
lizhihai_9924 分钟前
股市学习心得-A股服务器/算力服务器龙头
大数据·运维·服务器·人工智能·科技·学习
weixin_4462608527 分钟前
通过世界模拟器进行具象化视觉空间推理 (Astra)
人工智能
黎阳之光37 分钟前
数智赋能水厂全链路安全|黎阳之光以视频孪生技术落地供水精细化管控
人工智能·物联网·算法·安全·数字孪生
金融RPA机器人丨实在智能39 分钟前
即通过视觉识别技术为现有GUI软件加上“AI适配器”
人工智能·ai
YXWik61 小时前
图片 OCR 文字提取 (Python + AI 模型(ModelScope))
人工智能·python·ocr
自动跟随1 小时前
UWB自动跟随技术全栈解析:从定位算法到“位控一体化“
java·网络·人工智能
AiMagicGaGa1 小时前
被大模型 API 拿捏效率的研发日常
人工智能·aigc
云道轩1 小时前
腾讯云上有性能比较强的英伟达GPU
人工智能·云计算·腾讯云·英伟达gpu