文章目录
- 前言
- 一、视频椒盐噪声的生成与消除
- [二、OpenCV 图像边界填充详解](#二、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
五种边界填充方式:
- 常量填充:用固定颜色填充边界
- 反射填充:以图像边缘为轴镜像反射(包含边缘像素)
- 反射填充:以图像边缘为轴镜像反射(不包含边缘像素,也叫对称填充)
- 复制边缘填充:直接复制图像边缘的像素值填充边界
- 循环填充:把图像当成环形,用对侧的像素填充边界
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()
代码运行结果:

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