【OpenCV实现平滑图像处理】

这篇具有很好参考价值的文章主要介绍了【OpenCV实现平滑图像处理】。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

概要

在图像处理中,低通滤波器是一种常用的技术,用于平滑、模糊或降低图像的噪音。这种滤波器通过去除图像中高频部分(即变化较快的部分)来实现这些效果。通过应用2D卷积操作,低通滤波器将每个像素的值与其周围像素的值进行加权平均,从而实现图像的平滑处理。

在实际应用中,我们可以定制不同类型的低通滤波器,例如平均滤波器、高斯滤波器等,根据需求选择合适的滤波器。平均滤波器将像素的值替换为其周围像素值的平均值,从而消除图像中的高频噪音。而高斯滤波器则使用高斯函数生成一个权重矩阵,将像素值进行加权平均,使得距离中心像素越远的像素权重越小,实现更加自然的平滑效果。

定制的低通滤波器可以根据图像特性进行调整,例如在面对强烈噪音时增加滤波器的大小,或者根据图像中对象的大小调整滤波器的标准差。这种灵活性使得低通滤波器在图像处理中具有广泛的应用,例如在计算机视觉中的目标检测、图像识别、医学图像处理等领域。

2D 卷积(图像过滤)

使用各种低通滤波平滑图像
将定制的过滤器应用在图像上(2D卷积)

OpenCV提供了一个非常有用的函数,即cv.filter2D,该函数允许我们将一个图像和一个自定义的核(也称为滤波器)进行卷积操作。举个例子,如果我们想在一幅图像上尝试平均滤波,我们可以使用一个简单的平均核,该核中的所有元素值相等,代表了平均操作。通过使用cv.filter2D函数,我们可以将这个平均核应用到图像上,从而实现平均滤波的效果。

这种滤波技术不仅可以用于去除图像中的噪声,还可以在图像处理任务中发挥关键作用,比如在边缘检测、图像增强和特征提取等领域。
一个 5 X 5 的平均滤波核如下所示:

【OpenCV实现平滑图像处理】,python深度学习,# 学习笔记,智能家居,opencv,图像处理,人工智能,python,计算机外设,计算机视觉,算法
保持这个核在像素上面,将被这个核覆盖的25个像素点的值求平均值,然后将这个平均值替换掉最中间那个像素点的值。然后将这个操作应用在图像的所有像素点上。

# 导入必要的库
import numpy as np  # 用于数值计算
import cv2 as cv     # OpenCV库,用于图像处理
import matplotlib.pyplot as plt  # 用于绘图和可视化

# 读取图像文件 'img.png'
img = cv.imread('img.png')

# 定义一个 5x5 的平均滤波核
kernel = np.ones((5, 5), np.float32) / 25

# 使用 cv2.filter2D 函数将图像与平均滤波核进行卷积
dst = cv.filter2D(img, -1, kernel)

# 绘制原始图像、平均滤波后的图像并显示
plt.subplot(121)  # 创建第一个子图
plt.imshow(img)    # 显示原始图像
plt.title('Original')  # 设置子图标题为 'Original'
plt.xticks([]), plt.yticks([])  # 隐藏坐标轴

plt.subplot(122)  # 创建第二个子图
plt.imshow(dst)    # 显示平均滤波后的图像
plt.title('Averaging')  # 设置子图标题为 'Averaging'
plt.xticks([]), plt.yticks([])  # 隐藏坐标轴

plt.show()  # 显示绘制好的图像

【OpenCV实现平滑图像处理】,python深度学习,# 学习笔记,智能家居,opencv,图像处理,人工智能,python,计算机外设,计算机视觉,算法

模糊图像(平滑图像)

图像处理中,模糊(或称平滑)图像是一种常见的操作,可以通过低通滤波器与图像进行卷积来实现。这个技术非常有效地去除图像中的噪声,因为它能够消除高频内容,比如噪声和边缘。然而,需要注意的是,模糊操作也会稍微模糊图像的边缘,尽管有一些特殊的模糊技术可以保持边缘的清晰度。

  1. 平均
    这是通过将图像与归一化框滤波器进行卷积完成的。它简单的将核下面的像素值求平均并覆盖中间的像素值。这个可以使用函数cv.blur() 或者 cv.boxFilter() 来实现。我们应该指定内核的高度和宽度。一个 3 X 3 的归一化框滤波器如下所示:
    【OpenCV实现平滑图像处理】,python深度学习,# 学习笔记,智能家居,opencv,图像处理,人工智能,python,计算机外设,计算机视觉,算法
    Note: 如果你不想使用归一化框滤波器,那可以使用 cv.boxFilter。将 normalize=False 传入函数。
# 导入必要的库
import cv2 as cv  # OpenCV库,用于图像处理
import numpy as np  # 用于数值计算
from matplotlib import pyplot as plt  # 用于绘图和可视化

# 读取图像文件 'img.png'
img = cv.imread('img.png')

# 使用平均模糊(平滑)技术对图像进行处理,卷积核大小为 (5, 5)
blur = cv.blur(img, (5, 5))

# 绘制原始图像和模糊处理后的图像并显示
plt.subplot(121)  # 创建第一个子图
plt.imshow(img)    # 显示原始图像
plt.title('Original')  # 设置子图标题为 'Original'
plt.xticks([]), plt.yticks([])  # 隐藏坐标轴

plt.subplot(122)  # 创建第二个子图
plt.imshow(blur)   # 显示平均模糊后的图像
plt.title('Blurred')  # 设置子图标题为 'Blurred'
plt.xticks([]), plt.yticks([])  # 隐藏坐标轴

plt.show()  # 显示绘制好的图像

【OpenCV实现平滑图像处理】,python深度学习,# 学习笔记,智能家居,opencv,图像处理,人工智能,python,计算机外设,计算机视觉,算法

2.高斯滤波(Gaussian Blur)
在高斯滤波中,我们使用高斯核替代了盒(框)滤波器。这种滤波方法已经被集成在OpenCV的cv.GaussianBlur()函数中。在使用高斯滤波时,我们需要确定核的高度和宽度,这两个数值需要是正数且奇数。此外,我们还需要指定X和Y方向上的标准差(sigma X和sigma Y)。如果只确定了sigma X,那么sigma Y的值会被设置为与sigma X相同。如果两者都为0,那么它们的值会根据核的大小自动计算。

高斯滤波在去除图像中的高斯噪声方面非常有效。高斯核的权重分布使得中心像素周围的像素对平均值的贡献更大,这样可以更好地保留图像的细节。

import cv2 as cv
import numpy as np
from matplotlib import pyplot as plt

# 读取图像文件 'img.png'
img = cv.imread('img.png')

# 使用高斯滤波(核大小为 5x5,标准差为 0,表示自动计算)
blur = cv.GaussianBlur(img, (5, 5), 0)

# 绘制原始图像和高斯滤波处理后的图像并显示
plt.subplot(121)  # 创建第一个子图
plt.imshow(img)    # 显示原始图像
plt.title('Original')  # 设置子图标题为 'Original'
plt.xticks([]), plt.yticks([])  # 隐藏坐标轴

plt.subplot(122)  # 创建第二个子图
plt.imshow(blur)   # 显示高斯滤波后的图像
plt.title('Blurred')  # 设置子图标题为 'Blurred'
plt.xticks([]), plt.yticks([])  # 隐藏坐标轴

plt.show()  # 显示绘制好的图像

【OpenCV实现平滑图像处理】,python深度学习,# 学习笔记,智能家居,opencv,图像处理,人工智能,python,计算机外设,计算机视觉,算法

中值模糊

中值模糊是一种特殊的滤波技术,它的原理是在核的覆盖区域内找到像素值的中间值,并将中间值赋给核中心的像素点。与其他滤波方法不同,中值滤波不是使用计算得到的新值替代中心像素,而是直接采用该区域内的中间值。

在OpenCV中,中值滤波可以通过cv.medianBlur()函数实现。与其他滤波方法类似,中值滤波的核的大小也应该是正数和奇数。这种滤波技术在处理图像中的椒盐噪声(图像中随机出现的亮或暗像素点)非常有效。因为它通过选择中间值,可以避免受到噪声的干扰。

import cv2 as cv
import numpy as np
from matplotlib import pyplot as plt

# 读取图像文件 'img.png'
img = cv.imread('img.png')

# 使用中值模糊(核大小为 5x5)
blur = cv.medianBlur(img, 5)

# 绘制原始图像和中值模糊处理后的图像并显示
plt.subplot(121)  # 创建第一个子图
plt.imshow(img)    # 显示原始图像
plt.title('Original')  # 设置子图标题为 'Original'
plt.xticks([]), plt.yticks([])  # 隐藏坐标轴

plt.subplot(122)  # 创建第二个子图
plt.imshow(blur)   # 显示中值模糊后的图像
plt.title('Blurred')  # 设置子图标题为 'Blurred'
plt.xticks([]), plt.yticks([])  # 隐藏坐标轴

plt.show()  # 显示绘制好的图像

【OpenCV实现平滑图像处理】,python深度学习,# 学习笔记,智能家居,opencv,图像处理,人工智能,python,计算机外设,计算机视觉,算法

双边过滤

双边过滤在需要处理噪声但又需要保持图像边缘清晰的场景中非常有效。它的操作由cv.bilateralFilter()函数完成。相较于其他滤波器,这个操作相对较慢。我们已经了解到,高斯滤波器通过获取像素周围的邻域并计算其高斯加权平均值来进行操作。高斯滤波仅仅是一个空间函数,即在滤波时只考虑相邻像素的值。它不会检查像素值是否接近,也不会检查一个像素是否是边缘像素。因此,它可能会模糊掉一些我们希望保留的边缘细节。

双边滤波在空间上同样使用高斯滤波器,但还引入了一个像素强度差异的高斯滤波器。空间上的高斯函数确保只有附近的像素被用来进行模糊处理,而像素差异高斯函数确保只有与中心像素具有相似强度的像素被模糊处理。因此,它可以保持图像边缘的清晰度,因为边缘处的像素会有较大的强度变化,不容易被平滑掉。这种特性使得双边滤波在同时保持图像细节和去除噪声的需求下表现出色。

import cv2 as cv
import numpy as np
from matplotlib import pyplot as plt

# 读取图像文件 'img.png'
img = cv.imread('img.png')

# 使用双边过滤(参数:d表示领域直径,sigmaColor表示颜色空间标准差,sigmaSpace表示坐标空间标准差)
blur = cv.bilateralFilter(img, d=9, sigmaColor=75, sigmaSpace=75)

# 绘制原始图像和双边过滤处理后的图像并显示
plt.subplot(121)  # 创建第一个子图
plt.imshow(img)    # 显示原始图像
plt.title('Original')  # 设置子图标题为 'Original'
plt.xticks([]), plt.yticks([])  # 隐藏坐标轴

plt.subplot(122)  # 创建第二个子图
plt.imshow(blur)   # 显示双边过滤后的图像
plt.title('Bilateral Filtered')  # 设置子图标题为 'Bilateral Filtered'
plt.xticks([]), plt.yticks([])  # 隐藏坐标轴

plt.show()  # 显示绘制好的图像

【OpenCV实现平滑图像处理】,python深度学习,# 学习笔记,智能家居,opencv,图像处理,人工智能,python,计算机外设,计算机视觉,算法

小结

总之,低通滤波器通过2D卷积操作,能够有效平滑图像、去除噪音、提高图像质量,为各种图像处理任务提供了重要支持。通过定制不同类型的滤波器,我们能够根据具体需求进行图像处理,获得更清晰、更有信息量的图像结果。文章来源地址https://www.toymoban.com/news/detail-714430.html

到了这里,关于【OpenCV实现平滑图像处理】的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【OpenCV】第七章: 图像平滑处理

    第七章: 图像平滑处理 1、什么是图像平滑处理 图像平滑处理就是,将图像中与 周围像素点的像素值差异较大的像素点 调整成 和周围像素点像素值 相近的值。 例如: 2、为什么要进行平滑处理? 因为图像在采集(生成)、传输、处理的过程中常常会存在一定的噪声干扰,比如

    2024年02月03日
    浏览(46)
  • 第五章 Opencv图像处理框架实战 5-3 图像阈值与平滑处理

    ret, dst = cv2.threshold(src, thresh, maxval, type) src: 输入图,只能输入单通道图像,通常来说为灰度图 dst: 输出图 thresh: 阈值 maxval: 当像素值超过了阈值(或者小于阈值,根据type来决定),所赋予的值 type:二值化操作的类型,包含以下5种类型: cv2.THRESH_BINARY; cv2.THRESH_BINARY

    2024年02月14日
    浏览(41)
  • 【OpenCV • c++】图像平滑处理(1) —— 线性滤波

      平滑处理也称为模糊处理,是一种简单且使用频率很高的图像处理方法,平滑处理的用途有很多,最常见的是用来减少图像上的噪点或者失真。在涉及到降低图像分辨率时,平滑处理是非常好用的方法。   图像滤波指的是在尽量保留图像细节特征的条件下对图像的噪音

    2024年03月20日
    浏览(49)
  • 【图像处理OpenCV(C++版)】——5.5 图像平滑之双边滤波

    前言 : 😊😊😊 欢迎来到本博客 😊😊😊 🌟🌟🌟 本专栏主要结合OpenCV和C++来实现一些基本的图像处理算法并详细解释各参数含义,适用于平时学习、工作快速查询等,随时更新。 😊😊😊 具体食用方式:可以点击本专栏【OpenCV快速查找(更新中)】–搜索你要查询的算子

    2024年02月13日
    浏览(45)
  • 计算机图形图像技术(OpenCV核心功能、图像变换与图像平滑处理)

    1、显示图像 ①功能:在指定窗口中显示图像。 ②参数: name 为窗口的名字; image 为待显示的图像。 ③说明:可显示彩色或灰度的字节图像和浮点数图像,彩色图像数据按BGR顺序存储。 2、读入图像 ①功能:从指定文件读入图像。 ②参数: filename 为图像文件名,支持BMP、

    2024年02月03日
    浏览(46)
  • opencv-34 图像平滑处理-双边滤波cv2.bilateralFilter()

    双边滤波(BilateralFiltering)是一种图像处理滤波技术,用于平滑图像并同时保留边缘信息。与其他传统的线性滤波方法不同,双边滤波在考虑像素之间的空间距离之外,还考虑了像素之间的灰度值相似性。这使得双边滤波能够有效地去除噪声,同时保持图像的细节和边缘。

    2024年02月14日
    浏览(39)
  • opencv 31-图像平滑处理-方框滤波cv2.boxFilter()

    方框滤波(Box Filtering)是一种简单的图像平滑处理方法,它主要用于去除图像中的噪声和减少细节,同时保持图像的整体亮度分布。 方框滤波的原理很简单:对于图像中的每个像素,将其周围的一个固定大小的邻域内的像素值取平均,然后将这个平均值赋值给当前像素。这

    2024年02月14日
    浏览(43)
  • OpenCV单通道图像按像素成倍比例放大(无高斯平滑处理)

    OpenCV中的resize函数可以对图像做任意比例的放大(/缩小)处理,该处理过程会对图像做高斯模糊化以保证图像在进行放大(/缩小)后尽可能保留源图像所展现的具体内容(消除固定频率插值/采样带来的香农采样信息损失),但在有些场景中该方法不适用,如:部分应用场景只

    2024年04月11日
    浏览(53)
  • opencv 30 -图像平滑处理01-均值滤波 cv2.blur()

    图像平滑处理(Image Smoothing)是一种图像处理技术,旨在减少图像中的噪声、去除细节并平滑图像的过渡部分。这种处理常用于预处理图像,以便在后续图像处理任务中获得更好的结果。 常用的图像平滑处理方法包括: 均值滤波(Mean Filtering) :用图像中像素周围区域的平

    2024年02月01日
    浏览(52)
  • opencv(15) 图像平滑处理之二:cv2.GaussianBlur()高斯滤波

    高斯滤波是一种线性平滑滤波,适用于消除高斯噪声,广泛应用于图像处理的减噪过程。 高斯模板是通过对二维高斯函数进行采样(高斯模糊的卷积核里的数值满足高斯分布)、量化并归一化得到的,它考虑了邻域像素位置的影响,距离当前被平滑像素越近的点,加权系数越大

    2024年02月10日
    浏览(52)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包