【计算机视觉】OpenCV 实战:视频椒盐噪声生成与消除 + 图像边界填充详解

文章目录


前言

今天我们来分享两个计算机视觉入门的经典案例:一个是视频椒盐噪声的生成与消除,另一个是OpenCV 图像边界填充的五种方式。这两个项目都用到了 OpenCV 和 NumPy 库,非常适合刚接触计算机视觉的新手学习,既能练手又能快速理解图像处理的基础概念。

对计算机视觉感兴趣的朋友,也可以翻阅博主其他相关文章,里面整理了图像形态学操作、图像平滑处理等更多入门案例,可供大家拓展学习、参考借鉴。
【Python OpenCV 入门教程】图像读取、灰度转换、图片切分、视频逐帧处理
【计算机视觉】OpenCV 图像处理阈值处理 + 图像编辑 + 噪声滤波 + 图像运算


一、视频椒盐噪声的生成与消除

一.项目介绍

椒盐噪声是图像处理中最常见的噪声之一,它就像在图像上撒了黑白两种盐粒,会让图像出现随机的白点(盐噪声)和黑点(胡椒噪声)。本项目的核心功能是:给视频画面手动添加椒盐噪声,再用中值滤波消除噪声,直观对比处理前后的效果。

二、完整代码

c 复制代码
import cv2
import numpy as np
vidio_capture = cv2.VideoCapture('芦苇.mp4')#  摄像头:0
def add_peppersalt_noise(image,n = 10000):
    result = image.copy()
    h,w = image.shape[:2]
    for i in range(n):
        x = np.random.randint(0,h)
        y = np.random.randint(0,w)
        if np.random.randint(0,2 ) == 0:
            result [x,y] = 0
        else:
            result[x,y] = 255
    return result


while True:
    ret, frame = vidio_capture.read()
    noise = add_peppersalt_noise(frame)
    median = cv2.medianBlur(noise, 3)
    if not ret:
        break
    cv2.imshow('Video',frame)
    cv2.imshow('noise',noise)
    cv2.imshow('median',median)
    if cv2.waitKey(60)==27:   #ASCII码 ESC=27,空格=32
        break
vidio_capture.release()  #释放电脑资源避免卡顿
cv2.destroyAllWindows()

三.代码详细解析

导入依赖库:

cv2:OpenCV 库,是计算机视觉的核心工具,负责视频读取、图像显示、滤波处理等操作。

numpy:数值计算库,用来生成随机数、处理图像的像素矩阵。

c 复制代码
import cv2
import numpy as np

cv2.VideoCapture()是 OpenCV 读取视频的核心函数,参数可以是视频文件路径(如这里的"芦苇.mp4"),也可以是摄像头编号(比如0代表电脑默认摄像头)。

c 复制代码
video_capture = cv2.VideoCapture("芦苇.mp4")

定义添加椒盐噪声的函数

result = image.copy():复制原始图像,避免直接修改原图导致后续处理出错。

h, w = image.shape[:2]:获取图像的高度和宽度,image.shape返回的是(高, 宽, 通道数),这里取前两个值即可。

for i in range(n):循环生成n个噪声点,n越大噪声越密集,新手可以先从10000开始尝试。

x = np.random.randint(0, h) 和 y = np.random.randint(0, w):随机生成噪声点的行坐标和列坐标。

np.random.randint(0, 2) == 0:随机决定这个点是黑点(0)还是白点(255),两种概率各占 50%。

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

视频循环处理与去噪:

ret, frame = video_capture.read():逐帧读取视频,ret是布尔值,表示是否成功读取到帧;frame是当前帧的图像数据。

if not ret: break:如果视频读取结束(比如到了最后一帧),就退出循环。

noise = add_peppersalt_noise(frame):给当前帧添加椒盐噪声。

median = cv2.medianBlur(noise, 3):核心去噪步骤,cv2.medianBlur()是中值滤波函数,第二个参数3是滤波器的核大小(必须是奇数,比如 3、5、7),核越大去噪效果越强,但也会让图像更模糊。

cv2.imshow():创建窗口并显示图像,三个窗口分别显示原始视频、噪声视频和去噪后的视频,方便对比效果。

cv2.waitKey(60):等待用户按键,参数60表示每帧之间等待 60 毫秒,控制视频播放速度;按下ESC键(ASCII 码 27)时退出循环。

c 复制代码
while True:
    ret, frame = vidio_capture.read()
    noise = add_peppersalt_noise(frame)
    median = cv2.medianBlur(noise, 3)
    if not ret:
        break
    cv2.imshow('Video',frame)
    cv2.imshow('noise',noise)
    cv2.imshow('median',median)
    if cv2.waitKey(60)==27:   #ASCII码 ESC=27,空格=32
        break

释放资源

video_capture.release():释放视频读取对象,避免占用电脑资源。

cv2.destroyAllWindows():关闭所有 OpenCV 创建的窗口,防止程序结束后窗口残留。

c 复制代码
video_capture.release()
cv2.destroyAllWindows()

代码运行结果:

二、OpenCV 图像边界填充详解

一.项目介绍

在图像处理中,很多操作(比如卷积滤波)会改变图像的尺寸,这时候就需要给图像添加边界(Padding)来保持尺寸不变。OpenCV 的cv2.copyMakeBorder()函数提供了五种常用的边界填充方式,本项目通过一个案例直观展示它们的区别。

二.完整代码

c 复制代码
import cv2
ct5 = cv2.imread('carh5.png')
ct5=cv2.resize(ct5,dsize=None,fx=0.5,fy=0.5)

top,bottom,left,right = 50,50,50,50
constant = cv2.copyMakeBorder(ct5,top,bottom,left,right,borderType=cv2.BORDER_CONSTANT,value=(123,50,20))
reflect = cv2.copyMakeBorder(ct5,top,bottom,left,right,borderType=cv2.BORDER_REFLECT)
reflect101 = cv2.copyMakeBorder(ct5,top,bottom,left,right,borderType=cv2.BORDER_REFLECT101)
replicate = cv2.copyMakeBorder(ct5,top,bottom,left,right,borderType=cv2.BORDER_REPLICATE)
wrap = cv2.copyMakeBorder(ct5,top,bottom,left,right,borderType=cv2.BORDER_WRAP)

cv2.imshow('constanr',constant)
cv2.waitKey()
cv2.imshow('reflect',reflect)
cv2.waitKey()
cv2.imshow('reflect101',reflect101)
cv2.waitKey()
cv2.imshow('replicate',replicate)
cv2.waitKey()
cv2.imshow('wrap',wrap)
cv2.waitKey()
cv2.destroyAllWindows()

三.代码详细解析

导入依赖库并读取图像

cv2.imread('carh5.png'):读取本地图像文件。

cv2.resize():缩放图像,fx=0.5, fy=0.5表示将图像的宽和高都缩小为原来的一半,避免图像太大超出屏幕。

c 复制代码
import cv2

ct5 = cv2.imread('carh5.png')
ct5 = cv2.resize(ct5, dsize=None, fx=0.5, fy=0.5)

设置边界填充的尺寸

定义上下左右四个方向各填充 50 个像素,后续所有填充方式都使用这个尺寸,方便对比。

c 复制代码
top, bottom, left, right = 50, 50, 50, 50

五种边界填充方式:

  1. 常量填充:用固定颜色填充边界
  2. 反射填充:以图像边缘为轴镜像反射(包含边缘像素)
  3. 反射填充:以图像边缘为轴镜像反射(不包含边缘像素,也叫对称填充)
  4. 复制边缘填充:直接复制图像边缘的像素值填充边界
  5. 循环填充:把图像当成环形,用对侧的像素填充边界

cv2.copyMakeBorder()的核心参数:

第一个参数是输入图像。

接下来四个参数分别是上、下、左、右需要填充的像素数。

borderType指定填充方式,是我们要重点理解的部分。

value只有在BORDER_CONSTANT模式下才需要,用来指定填充的颜色(BGR 格式)。

c 复制代码
constant = cv2.copyMakeBorder(ct5,top,bottom,left,right,borderType=cv2.BORDER_CONSTANT,value=(123,50,20))
reflect = cv2.copyMakeBorder(ct5,top,bottom,left,right,borderType=cv2.BORDER_REFLECT)
reflect101 = cv2.copyMakeBorder(ct5,top,bottom,left,right,borderType=cv2.BORDER_REFLECT101)
replicate = cv2.copyMakeBorder(ct5,top,bottom,left,right,borderType=cv2.BORDER_REPLICATE)
wrap = cv2.copyMakeBorder(ct5,top,bottom,left,right,borderType=cv2.BORDER_WRAP)

显示并退出

cv2.imshow()依次显示五种填充方式的效果,cv2.waitKey()会暂停程序,直到用户按下任意键再显示下一个窗口,方便我们逐个观察对比。

最后用cv2.destroyAllWindows()关闭所有窗口。

c 复制代码
cv2.imshow('constanr',constant)
cv2.waitKey()
cv2.imshow('reflect',reflect)
cv2.waitKey()
cv2.imshow('reflect101',reflect101)
cv2.waitKey()
cv2.imshow('replicate',replicate)
cv2.waitKey()
cv2.imshow('wrap',wrap)
cv2.waitKey()
cv2.destroyAllWindows()

代码运行结果:


总结

读者朋友可以先照着代码运行一遍,再修改参数(比如噪声点数量、中值滤波核大小、填充像素数)观察效果变化,加深理解。这些操作是学习计算机视觉的基石,熟练掌握后,才能进一步学习更多进阶内容。

相关推荐
AI职业加油站11 小时前
从政策到实战:人工智能算法工程师证书的完整价值分析
人工智能·python·学习·算法·职场和发展
nashane11 小时前
HarmonyOS 6学习:听书App被“误杀”?音频焦点与AudioSession共存避坑指南
学习·音视频·harmonyos
风雨中的小七11 小时前
和AI一起搞事情#6. 如何实现图片文字元素编辑?
人工智能·llm
圣殿骑士-Khtangc11 小时前
深入拆解 Transformer 注意力机制:从 MHA 到 MLA,大模型性能跃迁的底层密码
人工智能
ai产品老杨11 小时前
统一构建高并发音视频底座:基于 Docker+边缘计算的 GB28181/RTSP 异构设备纳管架构解析(特供源码交付)
docker·音视频·边缘计算
ai产品老杨11 小时前
架构师视点:基于 Docker 与边缘计算的 AI 视频管理平台,如何构建 GB28181/RTSP 统一接入与源码交付生态?
人工智能·docker·边缘计算
学编程的小程11 小时前
Mac mini跑OpenClaw:低功耗家庭AI服务器搭建与飞书接入实战
服务器·人工智能·macos
薛会11 小时前
Cosmos Policy:用视频生成模型的“肌肉记忆“教会机器人操控
人工智能
烟雨江南78511 小时前
嘈杂工业场景下的自适应VAD与双码本声纹识别鉴权系统:基于端侧轻量化神经网络与向量量化(VQ)重构
人工智能·深度学习·神经网络·算法·语音识别