OpenCV-Python:图像平滑操作

news2024/11/24 1:12:23

目录

图像平滑基础

本文目标

2D卷积 

图像模糊(图像平滑)

平均模糊

高斯模糊

中值模糊

双边滤波


图像平滑基础

        在尽量保留图像原有信息的情况下,过滤掉图像内部的噪声,这一过程称为对图像的平滑处理,所得的图像称为平滑图像。

        一幅图像在获取传输等过程中会受到各种各样的噪声干扰。图像噪声来自多方面,有来自系统外部的干扰,如电磁波或经电源串进系统内部而引起的外部噪声;也有来自系统内部的干扰,如摄像机的热噪声、电器的机械运动而产生的抖动噪声等。这些噪声干扰使图像退化,质量下降,表现为图像模糊、特征淹没、对图像分析不利。因此,去除噪声、恢复原始图像是图像处理中的一个重要内容。消除噪声的工作称为图像平滑。图像平滑 (image smoothing) 是一种区域增强算法. 可以帮助我们去除早点改善图片质量。

本文目标

  • 学习使用不同的低通滤波器对图像进行模糊

  • 使用自定义的滤波器对图像进行卷积(2D 卷积)

2D卷积 

        与信号一样,我们也可以对2D 图像实施低通滤波(LPF)、高通滤波(HPF)等。LPF 帮助我们去除噪生,模糊图像。HPF 帮助我们找到图像的边缘。OpenCV 提供的函数cv.filter2D() 可以帮助我们对一幅图像进行卷积操作。下面我们将对一幅图像使用平均滤波器。下面是一个5x5 的平均滤波器核:

        操作如下,将核放在图像的一个像素A 上,求与核对应的图像上25(5x5)个像素的和,再取平均数,用这个平均数替代像素A 的值。重复以上操作直到将图像的每一个像素值更新一遍。代码如下:


# -*- coding: utf-8 -*-

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

img = cv2.imread('opencv_logo.png')
kernel = np.ones((5,5),np.float32)/25
#cv.Filter2D(src, dst, kernel, anchor=(-1, -1))
#ddepth –desired depth of the destination image;
#if it is negative, it will be the same as src.depth();
#the following combinations of src.depth() and ddepth are supported:
#src.depth() = CV_8U, ddepth = -1/CV_16S/CV_32F/CV_64F
#src.depth() = CV_16U/CV_16S, ddepth = -1/CV_32F/CV_64F
#src.depth() = CV_32F, ddepth = -1/CV_32F/CV_64F
#src.depth() = CV_64F, ddepth = -1/CV_64F
#when ddepth=-1, the output image will have the same depth as the source.

dst = cv2.filter2D(img,-1,kernel)
plt.subplot(121),plt.imshow(img),plt.title('Original')
plt.xticks([]), plt.yticks([])
plt.subplot(122),plt.imshow(dst),plt.title('Averaging')
plt.xticks([]), plt.yticks([])
plt.show()

图像模糊(图像平滑)

        使用低通滤波器可以达到图像模糊的目的。这对与去除噪生很有帮助。其实就是去除图像中的高频成分,(比如噪音和边界)。所以边界也会被模糊一点。当然,也有一些模糊技术不会模糊掉边界。OpenCV 提供了四种模糊技术。 

平均模糊

        这是由一个归一化卷积框完成的。他只是用卷积框覆盖区域所有像素的平均值来代替中心元素。可以使用函数cv2.blur() 和cv2.boxFilter() 来完成这个任务。可以查看文档了解更多卷积框的细节。我们需要设定定卷积框的宽和高。下面是一个3x3 的归一化卷积框:

注意:如果你不想使用归一化卷积框,你应该使用cv2.boxFilter(),这时要传入参数normalize=False。 

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

img = cv2.imread('opencv_logo.png')
blur = cv2.blur(img,(5,5))

plt.subplot(121),plt.imshow(img),plt.title('Original')
plt.xticks([]), plt.yticks([])
plt.subplot(122),plt.imshow(blur),plt.title('Blurred')
plt.xticks([]), plt.yticks([])
plt.show()

 

高斯模糊

        现在把卷积核换成高斯核。(简单来说,方框不变,将原来每个方框的值是相等的,现在里面的值是符合高斯分布的,方框中心的值最大,其余方框根据距离离中心元素的距离􄧁递减,构构成一个高斯小山包。原来的求平均数现在变成求加权平均数,就是方框里的值。实现的函数是cv2.GaussianBlur()。我们指定高斯核的宽和和高,必须是奇数。以及高斯函数沿X,Y 方向的标准
差。如果我们只指定了X 方向的的标准差,Y 方向也会取相同值。如果两个标准差都是0,那么函数会根据核函数的大小自己算。高斯滤波可以有效的从图像中去除高斯噪声。如果你愿意的话,你也可以使用函数cv2.getGaussianKernel() 自己构建一个高斯核。
使用高斯模糊的核心代码是:

#0 是指根据窗口大小􈙹5,5􈙺来􄕐算􅒇斯函数标准差
blur = cv2.GaussianBlur(img,(5,5),0)

 

中值模糊

        顾名思义就是用与卷积框对应像素的中值来替代中心像素的值。这个滤波器经常用来去除椒盐噪声。前面的滤波器都是是用计算得到的一个新值来取代中心像素的值,而中值滤波是用中心像素周围(也可以是他本身)的值来取代他。他能有效的去除噪声。卷积核的大小也应该是一个奇数。
在这个例子中,我们给原始图像加上50% 的噪声然后再使用中值模糊。
代码:

median = cv2.medianBlur(img,5)

 

双边滤波

        函数cv2.bilateralFilter() 能在保持边界清晰的情况下有效的去除噪音。但是这种操作与其他滤波器相比会比较慢。我们已经知道高斯滤波器是求中心点邻近区域像素的高斯加权平均值。这种高斯滤波器只考像素之间的空间关系而不会考虑像素值之间的关系(像素的相似度)。所以这种方法不会考虑一个像素是否位于边界。因此边界也会别模糊掉,而这正不是我们想要。
        双边滤波在同时使用空间高斯权重和灰度值相似性高斯权重。空间高斯函数确保只有领近区域的像素对中心点有影响,灰度值相似性高斯函数确保只有与中心像素灰度值相近的才会被用来做模糊运算。所以这种方法会确保边界不会被模糊掉,因为边界处的灰度值变化比较大。
 

#cv2.bilateralFilter(src, d, sigmaColor, sigmaSpace)
#d – Diameter of each pixel neighborhood that is used during filtering.
# If it is non-positive, it is computed from sigmaSpace
#9 􄩪域直径􈙽两个75 分别是空􄾣􅒇斯函数标准差􈙽灰度值相似性􅒇斯函数标准差
blur = cv2.bilateralFilter(img,9,75,75)

更多的参考点:http://people.csail.mit.edu/sparis/bf_course/ 

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

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

相关文章

排序算法之三:希尔排序

希尔排序基本思想 希尔排序法又称缩小增量法 希尔排序法的基本思想是:先选定一个整数,把待排序文件中所有记录分成个组,所有距离为的记录分在同一组内,并对每一组内的记录进行排序。然后,取,重复上述分组…

ThingsBoard 前端项目轮播图部件开发

前言 ThingsBoard 是目前 Github 上最流行的开源物联网平台(14.6k Star),可以实现物联网项目的快速开发、管理和扩展, 是中小微企业物联网平台的不二之选。 本文介绍如何在 ThingsBoard 前端项目中开发轮播图部件。 产品需求 最近接到产品…

C++并查集

1.并查集概念 1.1.并查集定义 在一些应用问题中,需要: 将 n 个不同的元素划分成一些不相交的集合开始时,每个元素自成成为一个集合然后按一定的规律,将归于同一组元素的集合合并期间需要反复用到查询某个元素归属于那个集合的算…

python利用requests库进行接口测试的方法详解

前言 之前介绍了接口测试中需要关注得测试点,现在我们来看看如何进行接口测试,现在接口测试工具有很多种,例如:postman,soapui,jemter等等,对于简单接口而言,或者我们只想调试一下,使用工具是非…

迈入数据结构殿堂——时间复杂度和空间复杂度

目录 一,算法效率 1.如何衡量一个算法的好坏? 2.算法效率 二,时间复杂度 1.时间复杂度的概念 2.大O的渐进表示法 3.推导大O的渐进表示法 4.常见时间复杂度举例 三,空间复杂度 一,算法效率 数据结构和算法是密…

【产品】Axure的基本使用(二)

文章目录 一、元件基本介绍1.1 概述1.2 元件操作1.3 热区的使用 二、表单型元件的使用2.1 文本框2.2 文本域2.3 下拉列表2.4 列表框2.5 单选按钮2.6 复选框2.7 菜单与表格元件的使用 三、实例3.1 登录2.2 个人简历 一、元件基本介绍 1.1 概述 在Axure RP中,元件是…

如何使用透明显示屏

透明显示屏的使用主要取决于具体的应用场景和需求。以下是一些常见的使用透明显示屏的方法: 商业展示:透明显示屏可以作为商品展示柜,通过高透明度、高分辨率的屏幕展示商品细节,吸引顾客的注意力。同时,透明显示屏还可…

人工智能基本常识:让深度学习技术更加人性化

近年来,人工智能技术日臻成熟。现在,许多产品和服务都依靠人工智能技术实现自动化和智能化,因此它与我们的日常生活息息相关。无论是为我们带来各种便利的家用设备,还是我们一直在使用的产品制造方式,人工智能的影响无…

【算法题】智能成绩表(js)

总分相同按名字字典顺序。 解法: function solution(lines) {const [personNum, subjectNum] lines[0].split(" ").map((item) > parseInt(item));const subjects lines[1].split(" ");const classMates [];let results [];for (let i…

C++笔记:动态内存管理

文章目录 语言层面的内存划分C语言动态内存管理的缺陷new 和 delete 的使用了解语法new 和 delete 操作内置类型new 和 delete 操作自定义类型 new 和 delete 的细节探究new 和 delete 的底层探究operator new 和 operator new[]operator delete 和 operator delete[] 显式调用…

2023快速上手新红利项目:短剧分销推广CPS

短剧分销推广CPS是一个新红利项目,对于新手小白来说也可以快速上手。 以下是一些建议,帮助新手小白更好地进行短剧分销推广CPS: 学习基础知识:了解短剧的基本概念、制作流程和推广方式。了解短剧的市场需求和受众群体&#xff0c…

wpf devexpress如何使用AccordionControl

添加一个数据模型 AccordionControl可以被束缚到任何实现IEnumerable接口的对象或者它的派生类(例如IList,ICollection) 如下代码例子示范了一个简单的数据模型使用: using System.Collections.Generic;namespace DxAccordionGettingStart…

zabbix精简模板

一、监控项目介绍 linux自带得监控项目比较多,也不计较杂,很多监控项目用不到。所以这里要做一个比较精简得监控模版 二、监控模板克隆 1.搜索原模板 2.克隆模板 全克隆模板,这样就和原来原模板没有联系了,操作也不会影响原模…

软件测试基础知识+面试总结(超详细整理)

一、什么是软件? 软件是计算机系统中的程序和相关文件或文档的总称。 二、什么是软件测试? 说法一:使用人工或自动的手段来运行或测量软件系统的过程,以检验软件系统是否满足规定的要求,并找出与预期结果之间的差异…

UI设计中的肌理插画是什么样的?

肌理插画本质也和扁平插画差不多,相较扁平插画,肌理插画的层次感、细节更多,也会更立体生动。 肌理插画风格没有描边线,画面轻快,通过色块的明暗来区分每个元素,有点像色彩版的素描,但更简单&a…

一个人全干!之后台管理中的搜索区域的展开收缩组件。

后台管理系统中大多数都有列表的搜索,那么用户的需求又需要必要时收缩搜索区域,需要时再展开。 而且怪的是他还需要一些部分不可收缩,不需要的地方才收缩。使用v-if来解决吧又不咋美观,我们还需要一个简单的动画效果。我们先写一…

橘子学K8S02之容器中所谓的限制

前面我们知道了关于隔离在Linux中的实现是通过一组NameSpace做到的,而且实际上他只是修改了应用进程看到计算机的视图,对他的视野做了限制,只能看到某些特定的内容,但是当你把视角切换到宿主机的操作系统来看的时候,这…

JIT即时编译器深度解析——Java性能提升利器

文章目录 一、JIT概述1、为什么要用JIT即时编译器2、C1、C2与Graal编译器3、分层编译4、热点代码5、热点探测(1)方法调用计数器(2)回边计数器 二、编译优化技术1、方法内联(1)什么是方法内联(2&…

银行数据分析指标篇:最全银行数据指标体系打包送给你!

前两天分享了银行业数据分析的案例,今天呢,老李把金融行业的指标体系和典型分析场景完整分享给大家!做地通俗易懂,条理清晰,很快就能上手。 银行指标体系 “指标”作为业务和数据的结合,它使得业务目标可…

Vue 2.0源码分析-update

Vue 的 _update 是实例的一个私有方法,它被调用的时机有 2 个,一个是首次渲染,一个是数据更新的时候;由于我们这一章节只分析首次渲染部分,数据更新部分会在之后分析响应式原理的时候涉及。_update 方法的作用是把 VNo…