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

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

相关推荐
数据中穿行1 小时前
CAM多轴数控控制算法详解
人工智能
这张生成的图像能检测吗2 小时前
(论文速读)FastGCN:通过重要性采样快速学习图卷积网络
人工智能·深度学习·图神经网络
marteker2 小时前
宜家:对妇女的暴力行为从来都不只是影响妇女。
人工智能
kingmax542120082 小时前
AI大模型应用开发工程师学习路线(后端适合)
人工智能·大模型·后端应用开发
AI成长日志2 小时前
【微调专栏】微调前沿进展:个性化微调、自动化微调与联邦学习微调的技术突破与未来展望
人工智能·自动化
东离与糖宝2 小时前
告别 Python!Java 本地部署 Qwen 3.5 实战,Ollama + Spring Boot 保姆级教程
java·人工智能
羑悻的小杀马特2 小时前
LangChain实战:工具调用+结构化输出,让AI从“聊天“变“干活“
android·人工智能·langchain
AI技术分享2 小时前
连着搞了三天OpenClaw,我顿悟了,这玩意自带逆袭光环!
人工智能·ai·chatgpt·ai编程