OpenCV-Python16:图像平滑操作

目录

图像平滑基础

本文目标

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/ 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

leetcode--3. 无重复字符的最长子串[滑动窗口\哈希表 c++]

原题 : 3. 无重复字符的最长子串 - 力扣(LeetCode) 题目解析: 最长子串可以用滑动窗口解决,无重复字符可以使用哈希表解决。 算法原理: 滑动窗口哈希表 哈希表作为一个数组存放每个字符出现的次数。 …

C#云LIS系统源码 B/S架构,SaaS模式,可扩展性强

基于B/S架构的云LIS检验系统源码,整个系统的运行基于WEB层面,只需要在对应的工作台安装一个浏览器软件有外网即可访问。全套系统采用云部署模式,部署一套可支持多家医院检验科共同使用。 采用.Net Core新的技术框架、DEV报表、前端js封装、分…

数学learning

目录 移动平均 简单移动平均 加权移动平均 指数移动平均 矩阵求导 矩阵对标量求导 Matrix-by-scalar 标量对矩阵求导 Scalar-by-matrix 参考博客 移动平均 优化算法里面会涉及到一个知识点:指数移动平均。 但是为了知识的完整性,这里会将常见的移动…

【Mars3d】关于locationBar等控件的css样式冲突处理问题

【Mars3d】关于locationBar等控件的css样式冲突处理问题 问题场景: 1.通过代码加载new mars3d.control.Zoom(或者通过地球map初始化配置 option.control {加载放大缩小工具控件的时候,出现图标的样式冲突效果: 2.sceneModePicker&#xf…

jsp 学科竞赛成绩管理系统Myeclipse开发mysql数据库web结构java编程计算机网页项目

一、源码特点 JSP 学科竞赛成绩管理系统是一套完善的java web信息管理系统,对理解JSP java编程开发语言有帮助,系统具有完整的源代码和数据库,系统主要采用B/S模式开发。开发环境为 TOMCAT7.0,Myeclipse8.5开发,数据库为Mysq…

Spring Boot统一功能处理(Spring拦截器)

为什么需要Spring拦截器 原生的Spring AOP实现统一拦截有两大难点,1.定义拦截的规则难写;2.在切面类中拿到HttpSession比较难。为此Spring官方提供了拦截器帮我们解决了上面痛点。 实现登入信息验证拦截器 实现HanderInterceptor接口重写preHeadler方…

Python创建代理IP池详细教程

一、问题背景 在进行网络爬虫或数据采集时,经常会遇到目标网站对频繁访问的IP进行封禁的情况,为了规避这种封禁,我们需要使用代理IP来隐藏真实IP地址,从而实现对目标网站的持续访问。 二、代理IP池的基本概念 代理IP池是一个包…

微服务——服务保护Sentinel

雪崩问题 在单体项目里面,如果某一个模块出问题会导致整个项目都有问题。 在微服务项目里面,单独一个服务出问题理论上是不会影响别的服务的。 但是如果有别的业务需要调用这一个模块的话还是会有问题。 问题产生原因和解决思路 最初那只是一个小小…

ubuntu创建apt-mirror本地仓库

首先创建apt-mirror的服务端,也就是存储所有apt-get下载的文件和依赖。大约需要300G,预留400G左右空间就可以开始了。 安装ubuntu省略,用的是ubuntu202204 ubuntu挂载硬盘(不需要的可以跳过): #下载挂载工具 sudo apt…

数据库——存储过程及游标

智能2112杨阳 一、目的与要求: 1、掌握存储过程的工作原理、定义及操作方法 2、掌握函数的工作原理、定义及操作方法 3、掌握游标的工作原理、定义及操作方法 二、内容: 1. 创建存储过程,用来自动统计给定订单号的订单总金额 源码&…

SpringBoot - 事件机制使用详解(ApplicationEvent、ApplicationListener)

SpringBoot - 事件机制使用详解(ApplicationEvent、ApplicationListener) Spring 事件机制使用观察者模式来传递事件和消息。我们可以使用 ApplicationEvent 类来发布事件,然后使用 ApplicationListener 接口来监听事件。当事件发生时&#…

使用ThreadLocal.withIniti避免初始化为null问题

问题描述 我们在使用threadLocal的时,使用ThreadLocal.withInitial去初始化而不是使用new ThradLocal去初始化,这是为什么呢? 问题例子 比如说,假设我们想要在每个线程中维护一个独立的计数器 import java.util.concurrent.at…

Node.js创建一个简单的WebSocket接口,实现通信交互

Node.js创建一个简单的WebSocket接口,实现通信交互 一、为什么使用WebSocket? WebSocket,最大特点就是,服务器可以主动向客户端推送信息,客户端也可以主动向服务器发送信息,是真正的双向平等对话&#xf…

C++从bing采集各行业的企业官网信息

作为一名合格的销售,除了自己的人脉,还应该有新鲜的客户加入并发掘。不管哪行哪业,知彼知己,方才能做到百战百胜。今天我就用我们的专业技能,让销售获取更多同行业的公开企业信息,让业绩顺风顺水。 通常在C…

【代码随想录算法训练营-第六天】【哈希表】242,349,202,1

242.有效的字母异位词 第一遍 思考 比较简单&#xff0c;用数组就能实现了 class Solution {public boolean isAnagram(String s, String t) {int[] checkListi new int[256];int[] checkListj new int[256];for (int i 0; i < s.length(); i) {char checkChar s.ch…

修改Docker0和容器的地址

修改Docker0和容器的地址 1. 需求 默认服务器安装完Docker-ce后会给docker0分配172.17.0.1/16地址. 公司新接入一个网段正好与172.17.0.1/16冲突,此时访问这台服务器的容器时就会发生网络不可达. 2. 解决方法 修改/etc/docker/daemon.json 加入一个自定义网段 vim /etc/d…

基于单片机的智能小车 (论文+源码)

1. 系统设计 此次可编程智能小车系统的设计系统&#xff0c;结合STM32单片机&#xff0c;蓝牙模块&#xff0c;循迹模块&#xff0c;电机驱动模块来共同完成本次设计&#xff0c;实现小车的循迹避障功能和手机遥控功能&#xff0c;其整体框架如图2.1所示。其中&#xff0c;采用…

剧本杀小程序成为创业者新选择,剧本杀小程序开发

剧本杀作为现下年轻人最喜欢的新兴行业&#xff0c;发展前景非常乐观&#xff0c;即使剧本杀目前处于创新发展阶段&#xff0c;但剧本杀行业依然在快速发展中。 根据业内数据&#xff0c;预计2025年剧本杀市场规模能达到四百多亿元。市场规模的扩大自然也吸引来了不少的创业者…

利用机器学习实现客户细分的实战

前言&#xff1a; Hello大家好&#xff0c;我是Dream。 今天来学习一下机器学习实战中的案例&#xff1a;创建客户细分&#xff0c;在此过程中也会补充很多重要的知识点&#xff0c;欢迎大家一起前来探讨学习~ 一、导入数据 在此项目中&#xff0c;我们使用 UCI 机器学习代码库…

1+X大数据平台运维职业技能等级证书中级

该部分是选择题部分&#xff0c;实操题在主页的另一篇文章 考试名称&#xff1a;“1X”大数据平台运维职业技能等级证书&#xff08;中级&#xff09; 1X 大数据平台运维中级测试题一、单选题 以下哪种情况容易引发 HDFS 负载不均问题&#xff1f;&#xff08; C&#xff09…