机器视觉之图像处理篇

发布于:2025-08-15 ⋅ 阅读:(17) ⋅ 点赞:(0)

图像平滑处理包含:

1 均值滤波 2 方框滤波 3 高斯滤波 4 中值滤波 5 双边滤波

均值滤波(Mean filtering):是指用当前像素点周围nxn个像素值的均值来代替当前像素值。边界点的处理可以扩展当前图像的周围像素点padding

方框滤波:是指用当前像素点周围nxn个像素值的和来代替当前像素值。

高斯滤波(Mean filtering):对整幅图像进行加权平均的过程,每一个像素点的值,都由其本身和邻域内的其他像素值经过加权平均后得到。

中值滤波:会取当前像素点及其周围临近像素点(一共有奇数个像素点)的像素值,将这些像素值从小到大排序,然后将位于中间位置的像素值作为当前像素点的像素值。

[0,48,56,95,128,130,212,215,250]

import cv2
image = cv2.imread("zzd02.png",0)
ret ,binary = cv2.threshold(image,140,200,cv2.THRESH_BINARY)
ret1 ,binary1 = cv2.threshold(image,140,200,cv2.THRESH_BINARY_INV)
ret2 ,binary2 = cv2.threshold(image,140,200,cv2.THRESH_TRUNC)
ret3 ,binary3 = cv2.threshold(image,140,200,cv2.THRESH_TOZERO)
ret4 ,binary4 = cv2.threshold(image,140,200,cv2.THRESH_TOZERO_INV)

cv2.imshow("binary",binary)
cv2.waitKey(0)
cv2.imshow("binary1",binary1)
cv2.waitKey(0)
cv2.imshow("binary2",binary2)
cv2.waitKey(0)
cv2.imshow("binary3",binary3)
cv2.waitKey(0)
cv2.imshow("binary4",binary4)
cv2.waitKey(0)
cv2.destroyAllWindows()
  1. import cv2 - 导入 OpenCV 库,用于图像处理

  2. image = cv2.imread("zzd02.png",0) - 读取图像文件:

    • "zzd02.png" 是要读取的图像文件名
    • 第二个参数 0 表示以灰度模式读取图像(将彩色图像转为黑白)
  3. 接下来五行是不同类型的阈值处理:
    cv2.threshold()函数参数说明:

    • 第一个参数:输入图像(必须是灰度图)
    • 第二个参数:阈值(140)
    • 第三个参数:最大值(200)- 当像素值超过阈值时设置的值
    • 第四个参数:阈值处理类型

    五种阈值处理类型的区别:

    • cv2.THRESH_BINARY:超过阈值的像素设为最大值 (200),否则设为 0
    • cv2.THRESH_BINARY_INV:与上面相反,超过阈值的设为 0,否则设为最大值 (200)
    • cv2.THRESH_TRUNC:超过阈值的像素设为阈值 (140),低于阈值的保持不变
    • cv2.THRESH_TOZERO:超过阈值的像素保持不变,低于阈值的设为 0
    • cv2.THRESH_TOZERO_INV:与上面相反,超过阈值的设为 0,低于阈值的保持不变
  4. 显示处理结果:

    • cv2.imshow("binary",binary):显示处理后的图像,第一个参数是窗口名称
    • cv2.waitKey(0):等待用户按键,参数 0 表示无限等待
    • 每种阈值处理的结果都在单独的窗口中显示,按任意键会关闭当前窗口并显示下一个
  5. cv2.destroyAllWindows():关闭所有打开的图像窗口

这段代码的作用是展示同一幅图像在不同阈值处理方法下的效果,帮助理解各种阈值处理的差异。运行时,会依次显示 5 个处理结果窗口,每个窗口需要按一次键才能切换到下一个。

import cv2
import numpy as np

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

a = cv2.VideoCapture('test.avi')
if not a.isOpened():
    print("视频损坏,无法读取 ")
    exit()

while True:
    ref,fream=a.read()

    if not ref:
        break

    # fream = cv2.cvtColor(fream,cv2.COLOR_BGR2RGB)
    cv2.imshow("fream", fream)

    noise = add_peppersalt_noise(fream)
    cv2.imshow("noise", noise)
    GaussianB = cv2.GaussianBlur(noise, (3, 3), 1)  # 高斯滤波
    cv2.imshow('GaussianBlur', GaussianB)

    medianB =cv2.medianBlur(noise,3)
    cv2.imshow( 'medianBlur',medianB) # 4、中值滤波

    if cv2.waitKey(6)==27:
        break


a.release()
cv2.destroyAllWindows()




# blur1 =  cv2.blur(noise,(3,3))
# cv2.imshow( 'blur1',blur1)
# cv2.waitKey(0)
# blur2=cv2.blur(noise,(63,63))
# cv2.imshow('blur2',blur2)
# cv2.waitKey(0)
# boxFilter1 = cv2.boxFilter(noise,-1,(3,3),normalize = True)
# cv2.imshow('boxFilter1',boxFilter1)
# cv2.waitKey(0)
# boxFilter2 =cv2.boxFilter(noise,-1,(3,3),normalize = False)
# cv2.imshow('boxFilter 2',boxFilter2)
# cv2.waitKey(0)



导入库

python

运行

import cv2  # 导入OpenCV库,用于视频处理和图像处理
import numpy as np  # 导入NumPy库,用于生成随机数等操作

定义添加椒盐噪声的函数

python

运行

def add_peppersalt_noise(image, n=10000):
    result = image.copy()  # 复制原图,避免修改原图
    h, w = image.shape[:2]  # 获取图像的高度和宽度
    
    # 循环添加n个噪声点
    for i in range(n):
        # 随机生成噪声点的坐标
        x = np.random.randint(1, h)
        y = np.random.randint(1, w)
        
        # 50%概率添加黑色噪声(椒噪声),50%概率添加白色噪声(盐噪声)
        if np.random.randint(0, 2) == 0:
            result[x, y] = 0  # 黑色噪声
        else:
            result[x, y] = 255  # 白色噪声
    
    return result  # 返回添加噪声后的图像

3. 视频读取与处理主逻辑

python

运行

a = cv2.VideoCapture('test.avi')  # 打开视频文件

# 检查视频是否成功打开
if not a.isOpened():
    print("视频损坏,无法读取 ")
    exit()

# 循环读取视频帧
while True:
    ref, fream = a.read()  # 读取一帧,ref表示是否成功,fream是帧数据
    
    if not ref:  # 如果没有读取到帧(视频结束),退出循环
        break

    # 显示原始帧
    cv2.imshow("fream", fream)

    # 对当前帧添加椒盐噪声
    noise = add_peppersalt_noise(fream)
    cv2.imshow("noise", noise)  # 显示带噪声的帧
    
    # 高斯滤波去噪
    GaussianB = cv2.GaussianBlur(noise, (3, 3), 1)
    cv2.imshow('GaussianBlur', GaussianB)
    
    # 中值滤波去噪
    medianB = cv2.medianBlur(noise, 3)
    cv2.imshow('medianBlur', medianB)
    
    # 等待6毫秒,若按下ESC键(ASCII码27)则退出
    if cv2.waitKey(6) == 27:
        break

# 释放资源
a.release()  # 释放视频捕获对象
cv2.destroyAllWindows()  # 关闭所有显示窗口

4. 注释掉的其他滤波方法

代码末尾注释了几种其他的滤波方法,包括:

  • cv2.blur():均值滤波,使用不同大小的卷积核
  • cv2.boxFilter():方框滤波,可以选择是否归一化

代码功能总结

  1. 读取视频文件 "test.avi"
  2. 对视频的每一帧进行处理:
    • 显示原始帧
    • 给帧添加椒盐噪声并显示
    • 使用高斯滤波去除噪声并显示
    • 使用中值滤波去除噪声并显示
  3. 提供了退出机制(按 ESC 键)
  4. 包含了其他滤波方法的示例(已注释)

不同滤波方法的特点

  • 高斯滤波:对高斯噪声效果好,会使图像模糊
  • 中值滤波:对椒盐噪声效果显著,能较好保留边缘
  • 均值滤波:简单但容易使图像模糊
  • 方框滤波:可以选择是否归一化,灵活性高

运行这段代码时,会同时显示原始视频、带噪声视频以及两种去噪处理后的视频效果,便于直观比较不同去噪方法的效果。


网站公告

今日签到

点亮在社区的每一天
去签到