当前位置: 首页 > article >正文

图像平滑处理

文章目录

    • 一、理解图像平滑处理的意义
    • 二、均值滤波
    • 三、方框滤波
    • 四、高斯滤波
    • 五、中值滤波

一、理解图像平滑处理的意义

图像平滑处理,也称为图像模糊处理,是一种用于减少图像噪声和细节的图像处理技术。平滑处理的目的通常是为了消除图像中的随机噪声,减少图像中的高频成分,或者在保持图像整体外观的同时减少图像的对比度。常见的图像平滑技术:均值滤波、高斯滤波、模糊滤波等。
通过图像平滑处理,可以减少或消除图像中的随机噪声,减少图像的细节,例如在压缩图像前进行平滑处理,在去除噪声的同时尽量保留图像的边缘信息。

用以下这张图片来展示:
在这里插入图片描述
可以看到图片中有很多白色的小斑点。

二、均值滤波

# 导入OpenCV库,用于图像处理
import cv2
# 导入matplotlib的pyplot模块,用于图像显示
import matplotlib.pyplot as plt
# 导入numpy库,用于数值计算
import numpy as np

# 使用cv2.imread()函数读取位于指定路径的图像文件
img = cv2.imread("E:\\XUEXI\\Python_learn\\tupian\\6.jpg")

# 定义一个函数cv_show,用于显示图像
def cv_show(name, img):
    # 使用cv2.imshow()函数显示图像,名称为name
    cv2.imshow(name, img)
    # 使用cv2.waitKey(0)函数等待,直到用户按下任意键
    cv2.waitKey(0)
    # 使用cv2.destroyAllWindows()函数关闭所有OpenCV创建的窗口
    cv2.destroyAllWindows()

# 使用cv2.blur()函数对图像进行均值滤波
# (3, 3)指定了滤波器的大小,即3x3的邻域窗口
blur = cv2.blur(img, (3, 3))

# 调用cv_show函数显示均值滤波后的图像
cv_show("blur", blur)

cv2.blur()函数对图像进行均值滤波

blur = cv2.blur(img, (3, 3))(3, 3)指定了滤波器的大小,即3x3的邻域窗口,如果是均值滤波,那么就是要(3x3)中的所有值全部加起来,然后除以9,来求得均值。

运行结果:
在这里插入图片描述
可以看到图片中的小白点被淡化了许多。

三、方框滤波

方框滤波基本和均值滤波一样,但是能选择是否归一化

# 导入OpenCV库,用于图像处理
import cv2
# 导入matplotlib的pyplot模块,用于图像显示
import matplotlib.pyplot as plt
# 导入numpy库,用于数值计算
import numpy as np

# 使用cv2.imread()函数读取位于指定路径的图像文件
img = cv2.imread("E:\\XUEXI\\Python_learn\\tupian\\6.jpg")

# 定义一个函数cv_show,用于显示图像
def cv_show(name, img):
    # 使用cv2.imshow()函数显示图像,名称为name
    cv2.imshow(name, img)
    # 使用cv2.waitKey(0)函数等待,直到用户按下任意键
    cv2.waitKey(0)
    # 使用cv2.destroyAllWindows()函数关闭所有OpenCV创建的窗口
    cv2.destroyAllWindows()

# 使用cv2.boxFilter()函数对图像进行均值滤波
# 第一个参数是输入图像
# 第二个参数-1表示输出图像的深度与输入图像相同
# (3, 3)是滤波器的大小,即3x3的邻域窗口
# normalize=True表示滤波器的权重之和为1,这是均值滤波的要求
box = cv2.boxFilter(img, -1, (3, 3), normalize=True)

# 调用cv_show函数显示均值滤波后的图像
cv_show("box", box)

box = cv2.boxFilter(img, -1, (3, 3), normalize=True)python当中,指定一个值为-1,一般就是自动计算的意思。

方框滤波多一个参数(normalize),这个参数可以做归一化操作,就是当数值超过255后,就会除以相加数的总和,如果是(3x3)那就是除以9,做了归一化后就是跟均值滤波是一样效果的。

运行结果与均值滤波相同:
在这里插入图片描述

如果不选择做归一化,那么越界的值就直接取到255,也就是最高曝光的值:

#不同算子的差异
import cv2
import matplotlib.pyplot as plt
import numpy as np

img = cv2.imread("E:\\XUEXI\\Python_learn\\tupian\\6.jpg")

def cv_show(name, img):
    cv2.imshow(name, img)
    cv2.waitKey(0)
    cv2.destroyAllWindows()

box = cv2.boxFilter(img, -1, (3, 3), normalize=False)

cv_show("box",box)

运行结果:
在这里插入图片描述

四、高斯滤波

高斯滤波基于高斯分布(Gaussian Distribution),也称为正态分布,是一种在自然现象中普遍存在的连续概率分布。
高斯滤波的操作是将高斯核与图像进行卷积,即对图像中的每个像素,用其邻域内的像素值乘以对应的高斯核权重,然后求和得到新的像素值。
高斯模糊的卷积核里的数字是满足高斯分布, 相当与更重视中间的

正态分布是下面第三个图,越靠近中心值,其相关程度就越明显。
在这里插入图片描述

如上图,如果将204作为卷积核的中心,那么就会计算与中心值相近的其他8个值的重要程度。

# 导入OpenCV库,用于图像处理
import cv2
# 导入matplotlib的pyplot模块,用于图像显示
import matplotlib.pyplot as plt
# 导入numpy库,用于数值计算
import numpy as np

# 使用cv2.imread()函数读取位于指定路径的图像文件
img = cv2.imread("E:\\XUEXI\\Python_learn\\tupian\\6.jpg")

# 定义一个函数cv_show,用于显示图像
def cv_show(name, img):
    # 使用cv2.imshow()函数显示图像,名称为name
    cv2.imshow(name, img)
    # 使用cv2.waitKey(0)函数等待,直到用户按下任意键
    cv2.waitKey(0)
    # 使用cv2.destroyAllWindows()函数关闭所有OpenCV创建的窗口
    cv2.destroyAllWindows()

# 使用cv2.GaussianBlur()函数对图像进行高斯滤波
# (5, 5)是高斯核的大小,即5x5的邻域窗口
# 1是高斯核的标准差,控制着核的宽度,较大的值会导致更强的平滑效果
aussian = cv2.GaussianBlur(img, (5, 5), 1)

# 调用cv_show函数显示高斯滤波后的图像
cv_show("aussian", aussian)

运行结果:

在这里插入图片描述

五、中值滤波

中值滤波相当于用中值代替,如果是(3x3)的核,就是取这9个数的中间值来计算。

# 导入OpenCV库,用于图像处理
import cv2
# 导入matplotlib的pyplot模块,用于图像显示
import matplotlib.pyplot as plt
# 导入numpy库,用于数值计算
import numpy as np

# 使用cv2.imread()函数读取位于指定路径的图像文件
img = cv2.imread("E:\\XUEXI\\Python_learn\\tupian\\6.jpg")

# 定义一个函数cv_show,用于显示图像
def cv_show(name, img):
    # 使用cv2.imshow()函数显示图像,名称为name
    cv2.imshow(name, img)
    # 使用cv2.waitKey(0)函数等待,直到用户按下任意键
    cv2.waitKey(0)
    # 使用cv2.destroyAllWindows()函数关闭所有OpenCV创建的窗口
    cv2.destroyAllWindows()

# 使用cv2.medianBlur()函数对图像进行中值滤波
# 5是滤波器的半径,表示考虑的邻域大小为5x5
median = cv2.medianBlur(img, 5)

# 调用cv_show函数显示中值滤波后的图像
cv_show("median", median)

运行结果:
在这里插入图片描述

将均值滤波,高斯滤波,中值滤波三者结合起来观察:

#不同算子的差异
import cv2
import matplotlib.pyplot as plt
import numpy as np

img = cv2.imread("E:\\XUEXI\\Python_learn\\tupian\\6.jpg")

def cv_show(name, img):
    cv2.imshow(name, img)
    cv2.waitKey(0)
    cv2.destroyAllWindows()

blur = cv2.blur(img, (3, 3))
aussian = cv2.GaussianBlur(img, (5, 5), 1)
median = cv2.medianBlur(img, 5)

res = np.hstack((blur, aussian, median))
cv_show("res", res)

在这里插入图片描述


http://www.kler.cn/news/368599.html

相关文章:

  • 曹景行先生
  • UML外卖系统报告(包含具体需求分析)
  • unity3d——PlayerPrefs day01——基础知识点
  • offset Explorer连接云服务上的kafka连接不上
  • 项目:Boost 搜索引擎
  • 图---java---黑马
  • 关于Drawio调整圆角弧度
  • 突破AI极限!GPT写的英语作文在全国大学生大赛中得分99!
  • No.19 笔记 | WEB安全 - 任意文件操作详解 part 1
  • JAVA基础面试题准备
  • SQL进阶技巧:巧用异或运算解决经典换座位问题
  • C语言数据结构学习:单链表
  • 【Ubuntu】服务器系统重装SSHxrdpcuda
  • C语言 | Leetcode C语言题解之第507题完美数
  • 资源所有者管理共享交换机
  • 啤酒游戏—企业经营决策沙盘
  • 人工智能_神经网络103_感知机_感知机工作原理_感知机具备学习能力_在学习过程中自我调整权重_优化效果_多元线性回归_逻辑回归---人工智能工作笔记0228
  • 落实“双碳”行动,深兰科技推动分子能源技术在AI硬件产品领域的应用及产业化进程
  • 【开发日记】如何让指定用户执行sudo命令时无需输入密码
  • 例程学习(学习笔记)
  • 盲盒小程序/APP系统,市场发展下的新机遇
  • <<机器学习实战>>15-26节笔记:逻辑回归参数估计、梯度下降及优化、模型评价指标
  • 【了解一下静态代理与动态代理】
  • 无线红外单点温度传感器解决方案
  • git lfs问题(下载大模型的时候出的问题)
  • C语言单链表