计算机视觉 ---图像模糊

1、图像模糊的作用:

  • 减少噪声

    • 在图像获取过程中,例如通过相机拍摄或者传感器采集,可能会受到各种因素的干扰,从而引入噪声。这些噪声在图像上表现为一些孤立的、不符合图像主体内容的像素变化,如椒盐噪声(随机出现的黑白像素点)和高斯噪声(使图像整体变得模糊的噪声)。
    • 通过模糊处理,可以将这些噪声点与周围像素融合,从而使噪声在视觉上得到减弱,让图像看起来更加干净、平滑。例如,在天文观测图像中,由于信号微弱且探测器可能受到宇宙射线等干扰,图像会带有噪声,使用模糊方法能够有效改善图像质量,便于天文学家观察天体的特征。
  • 突出主体

    • 当图像包含多个元素,且主体与背景或者其他元素在视觉上相互干扰时,模糊可以用来弱化次要元素,从而使主体更加突出。
    • 例如在人物摄影作品中,如果背景比较杂乱,通过对背景进行模糊处理,能够引导观众的注意力聚焦在人物主体上,就像在拍摄肖像照时,利用浅景深效果(通过相机设置或者后期处理来模糊背景)突出人物面部表情和特征。
  • 模拟特定效果

    • 模拟景深效果:在摄影中,景深是指在拍摄的场景中,能够清晰成像的距离范围。通过对图像的部分区域进行模糊,可以模拟出相机拍摄时的景深效果,即焦点处清晰,而焦点外逐渐模糊。这可以增强图像的真实感和层次感,让二维的图像更有三维空间的感觉。
    • 模拟运动模糊:当物体在快速运动时,相机拍摄的图像会产生运动模糊效果。在图像制作或者后期处理中,可以通过模糊来模拟这种效果,用于表现物体的动态和速度感。比如在制作赛车游戏的宣传海报时,对赛车的图像进行适当的运动模糊处理,可以让海报更具动感和速度感。
  • 保护隐私

    • 在一些情况下,需要对图像中的人物面部或者敏感信息进行模糊处理。例如在新闻报道中,当涉及到不愿意曝光面部的人物或者需要隐藏某些隐私信息(如车牌号码、身份证号码等)时,通过模糊这些部分,使它们无法被清晰辨认,从而保护个人隐私。

2、常见模糊方法:

  • 均值模糊(Average Blur)

    • 原理:对于图像中的每个像素,计算其周围邻域(通常是一个矩形区域,如 3×3、5×5 等)内所有像素值的平均值,然后将这个平均值作为该像素的新值。例如,对于一个 3×3 邻域,就是将这 9 个像素的红、绿、蓝通道(如果是彩色图像)的值分别相加,再除以 9,得到新的像素值。
    • 特点:计算简单,能够快速地对图像进行平滑处理,有效地减少噪声。但是,这种方法会导致图像细节丢失较多,因为它是简单地求平均,会使图像变得比较模糊和平滑,对于边缘等细节的保留能力较差。
  • 高斯模糊(Gaussian Blur)

    • 原理:基于高斯函数来确定每个像素周围邻域内像素值对当前像素的影响权重。离当前像素越近的像素,其权重越大;离得越远,权重越小。然后根据这些权重计算出当前像素的新值。通常也会使用一个矩形邻域,如 3×3、5×5 等。高斯函数的数学表达式决定了这种权重的分布规律。
    • 特点:是一种比较常用的模糊方法,它在模糊图像的同时,能够较好地保留图像的边缘和主要细节信息。相比均值模糊,它对图像细节的破坏相对较小,能够产生更加自然的模糊效果,因为它的权重分配更符合人眼对周围物体的视觉感知规律。
  • 中值模糊(Median Blur)

    • 原理:选取图像中每个像素点周围邻域内像素值的中位数,并用这个中位数来替换当前像素点的值。邻域大小同样可以是 3×3、5×5 等。例如,对于一个 3×3 邻域内的 9 个像素值,将它们从小到大排序,取中间的值作为中心像素的新值。
    • 特点:对于去除椒盐噪声等具有较好的效果,因为它不是通过求平均来模糊,而是取中位数,所以在一定程度上能够保留图像的边缘和细节,避免了像均值模糊那样过度平滑图像。
  • 双边模糊(Bilateral Blur)

    • 原理:考虑了像素点的空间距离和像素值的差异两个因素。一方面根据像素点之间的空间距离确定权重,如同高斯模糊;另一方面根据像素值的差异确定权重,即对于与当前像素值差异较大的像素,给予较小的权重,反之给予较大的权重。最后综合这两个权重来计算当前像素点的新值。
    • 特点:能够在模糊图像的同时,很好地保留图像的边缘细节,实现了一种既能模糊背景又能使主体边缘清晰的效果。常用于需要突出主体且保持主体边缘清晰的场景,如人像摄影后期处理等。

3、举个例子:

        这里使用高斯模糊对一张图像在不同尺度上进行模糊处理,感兴趣的话大家也可以尝试使用其他模糊方法对图像进行处理。

这里使用到了OpenCV库中的cv2.GaussianBlur()函数进行高斯模糊处理,函数参数有以下几个:

  • src:这是要进行高斯模糊处理的原始图像。图像可以是单通道(如灰度图)或多通道(如彩色图,通常为 BGR 格式)。例如,你可以使用cv2.imread函数读取一幅图像作为src参数的值。
  • ksize:它是一个表示高斯核大小的元组。核大小决定了模糊的程度和范围。元组的格式为(width, height),通常使用正方形核,即widthheight相等,如(3,3)(5,5)(7,7)等。核越大,模糊效果越明显。
  • sigmaX:它是高斯核在 X 方向(水平方向)上的标准差。这个参数控制了高斯分布的形状,从而影响模糊的效果。如果将其设置为 0,则函数会根据ksize自动计算一个合适的值。通常,手动设置一个合适的值可以更精细地调整模糊效果。例如,对于一些需要轻微模糊的图像,可以设置一个较小的sigmaX值。
  • sigmaY(可选):它是高斯核在 Y 方向(垂直方向)上的标准差。如果不指定这个参数(即只传入三个参数srcksizesigmaX),函数会默认sigmaY = sigmaX,也就是在 X 和 Y 方向上使用相同的标准差进行模糊处理。

(对于其他的模糊处理方法,OpenCV中也有对应的函数可以使用,感兴趣的话可以尝试一下)

具体代码及注释如下:

import cv2
import matplotlib.pyplot as plt# 读取图像
image = cv2.imread('./luffy.jpeg')
# 将图像从BGR格式转换为RGB格式,以便在matplotlib中正确显示
image_rgb = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)# 定义不同尺度的高斯模糊邻域大小
kernel_sizes = [23, 45, 65]# 存储不同尺度模糊后的图像结果
blurred_images = []# 对图像进行不同尺度的高斯模糊
for kernel_size in kernel_sizes:blurred_image = cv2.GaussianBlur(image_rgb, (kernel_size, kernel_size), 0)blurred_images.append(blurred_image)# 显示原始图像和不同尺度模糊后的图像
plt.figure(figsize=(10, 10))  # 调整图形大小以适应2x2的布局# 显示原始图像
plt.subplot(2, 2, 1)  # 2行,2列,第1个位置
plt.imshow(image_rgb)
plt.title('Original Image')
plt.axis('off')# 显示不同尺度模糊后的图像
for i, blurred_image in enumerate(blurred_images):plt.subplot(2, 2, i + 2)  # 2行,2列,第2到第4个位置plt.imshow(blurred_image)plt.title(f'Gaussian Blur with Kernel Size {kernel_sizes[i]}')plt.axis('off')plt.tight_layout()  # 确保图像布局紧凑
plt.show()

最终效果图(对两个图像分别进行高斯模糊):

有任何问题欢迎在评论区提出讨论!

Over!!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/60580.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

串口DMA接收不定长数据

STM32F767—>串口通信接收不定长数据的处理方法_stm32串口超时中断-CSDN博客 STM32-HAL库串口DMA空闲中断的正确使用方式解析SBUS信号_stm32 hal usart2 dma-CSDN博客 #define USART1_RxBuffSize 100 extern DMA_HandleTypeDef hdma_usart1_rx; //此处声明的变量在…

web实验3:虚拟主机基于不同端口、目录、IP、域名访问不同页面

创建配置文件: 创建那几个目录及文件,并且写内容: 为网卡ens160添加一个 IPv4 地址192.168.234.199/24: 再重新激活一下网卡ens160: 重启服务: 关闭防火墙、改宽松模式: 查看nginx端口监听情况:…

Jmeter中的监听器(二)

5--JSR223 Listener 用途 自定义数据处理:使用脚本语言处理测试结果,实现高度定制化的数据处理和分析。实时监控:实时处理和显示测试结果。集成外部系统:将测试结果发送到外部系统进行进一步处理和分析。日志记录:记…

DP动态规划基础题(Kadane算法)

动态规划(Dynamic Programming,简称DP)是一种在数学、管理科学、计算机科学、经济学和生物信息学等领域中使用的,通过把原问题分解为相对简单的子问题的方式求解复杂问题的方法。动态规划算法通常用于优化问题,特别是那…

计算机组成原理——进位计数制

1.认识不同进制 通常的我们日常生活中用到的都是十进制,比如买东西或者期末成绩等等,当然肯定不止这一种进制方法,相关的还有二进制、八进制、十六进制,还有古罗马数字,通常古罗马数字近似可以看作是五进制的数&#x…

《.addClass()》

《.addClass()》 .addClass() 是一个在网页设计和开发中常用的 jQuery 函数,用于向 HTML 元素添加一个或多个类名。这个函数在美化网页、实现动态效果以及改善用户体验方面发挥着重要作用。本文将详细介绍 .addClass() 函数的用法、优势以及在实际开发中的应用案例。 1. .ad…

function and task

任务和函数 在Verilog语言中提供了任务和函数,可以将较大的行为级设计划分为较小的代码段,允许设计者将需要在多个地方重复使用的相同代码提取出来,编写成任务和函数,这样可以使代码更加简洁和易懂。 1.1任务 任务的定义 任务定义…

【C++】用红黑树封装set和map

在C标准库中,set容器和map容器的底层都是红黑树,它们的各种接口都是基于红黑树来实现的,我们在这篇文章中已经模拟实现了红黑树 ->【C】红黑树,接下来我们在此红黑树的基础上来看看如何封装set和map。 一、共用一颗红黑树 我…

4399 C++面试题及参考答案

C 和 C++ 的区别是什么? C 语言是一种过程式编程语言,而 C++ 是在 C 语言基础上发展而来的面向对象编程语言。 从语法层面来看,C 语言没有类和对象的概念。 而在 C++ 中可以定义类,把数据和操作数据的函数封装在一起,像这样: class Point { public:int x;int y;Point(int…

类与实例

1 问题如何理解类与实例? 2 方法 类与实例 类(class)的概述:用来描述具有相同的属性和方法的对象的集合。它定义了该集合中每个对象所共有的属性和方法。对象是类的实例。 类是一类事物,实例是具体的一个事物。 编程与生活是相通的&#xff0…

kafka常见面试题总结

Kafka 核心知识解析 一、Kafka 消息发送流程 Kafka 发送消息涉及两个线程:main 线程和 sender 线程。在 main 线程中,会创建一个双端队列 RecordAccumulator,main 线程负责将消息发送给 RecordAccumulator,而 sender 线程则从 R…

Rust 所有权机制

Rust 所有权机制 本文示例代码地址 所有权是Rust中最独特的特性,它让Rust无需GC就可以保证内存安全。 什么是所有权? 所有权(ownership)是 Rust 用于如何管理内存的一组规则。所有程序都必须管理其运行时使用计算机内存的方式…

2024/11/4 计网强化

10: 17: 22: 09: 11: 12: 13: 14: 15: 18: 19: 20: 21: 16:

hutool-雪花算法 id 生成器

配置 workId 和 datacenterId 设置工作机器ID(workerId)和数据中心ID(datacenterId),这两个参数用于确保在分布式环境中生成的ID是唯一的。使用配置 yaml 文件的方式获取,配置方式参考:https:/…

CentOS 9 配置网卡

在 CentOS 9 中配置网卡,通常涉及以下几个步骤: 1. 查看网络接口 首先,确认系统上存在的网络接口。可以使用 ip 命令或 ifconfig 命令查看网络接口的状态。 ip a 或者: ifconfig 这将列出所有可用的网络接口(例如…

力扣104 : 二叉树最大深度

补:二叉树的最大深度 描述: 给定一个二叉树 root ,返回其最大深度。二叉树的 最大深度 是指从根节点到最远叶子节点的最长路径上的节点数。 何解? 树一般常用递归:递到叶子节点开始倒着处理

机器情绪及抑郁症算法

🏡作者主页:点击! 🤖编程探索专栏:点击! ⏰️创作时间:2024年11月12日17点02分 点击开启你的论文编程之旅https://www.aspiringcode.com/content?id17230869054974 计算机来理解你的情绪&a…

M4 lotus 源码编译安装

查看系统版本 sw_vers ProductName: macOS ProductVersion: 15.1安装依赖 xcode-select -p /Library/Developer/CommandLineToolsbrew install go jq pkg-config hwloc coreutilscurl --proto https --tlsv1.2 -sSf https://sh.rustup.rs | sh设置环境变量 export LIBRARY…

JAVA学习日记(十五) 数据结构

一、数据结构概述 数据结构是计算机底层存储、组织数据的方式。 数据结构是指数据相互之间以什么方式排列在一起的。 数据结构是为了更加方便的管理和使用数据,需要结合具体的业务场景来进行选择。 二、常见的数据结构 (一)栈 特点&…

i春秋-SQLi(无逗号sql注入,-- -注释)

练习平台地址 竞赛中心 题目描述 后台有获取flag的线索应该是让我们检查源码找到后台 题目内容 空白一片 F12检查源码 发现login.php 访问login.php?id1 F12没有提示尝试sql注入 常规sql注入 //联合注入得到表格列数 1 order by 3 # 1 union select 1,2,3 #&#xff08…