OpenCV 07(图像滤波器)

一、卷积

什么是图片卷积?

图像卷积就是卷积核在图像上按行滑动遍历像素时不断的相乘求和的过程

步长

步长就是卷积核在图像上移动的步幅.

上面例子中卷积核每次移动一个像素步长的结果, 如果将这个步长修改为2, 结果会如何?

为了充分扫描图片, 步长一般设为1.

 

padding

从上面例子中我们发现, 卷积之后图片的长宽会变小. 如果要保持图片大小不变, 我们需要在图片周围填充0. padding指的就是填充的0的圈数.

我们可以通过公式计算出需要填充的0的圈数.

如果要保持卷积之后图片大小不变, 可以得出等式: (N + 2P - F + 1) = N从而可以推导出P = (F -1)/2

卷积核的大小

图片卷积中, 卷积核一般为奇数, 比如 3 * 3, 5 * 5, 7 * 7.为什么一般是奇数呢, 出于以下两个方面的考虑:

1. 根据上面padding的计算公式, 如果要保持图片大小不变, 采用偶数卷积核的话, 比如4 * 4, 将会出现填充1.5圈零的情况.
2. 奇数维度的过滤器有中心,便于指出过滤器的位置, 即OpenCV卷积中的锚点.

- filter2D(src, ddepth, kernel, dst, anchor, delta, borderType)
  - ddepth是卷积之后图片的位深, 即卷积之后图片的数据类型, 一般设为-1, 表示和原图类型一致.
  - kernel是卷积核大小, 用元组或者ndarray表示, 要求数据类型必须是float型.
  - anchor 锚点, 即卷积核的中心点, 是可选参数, 默认是(-1,-1)
  - delta 可选参数, 表示卷积之后额外加的一个值, 相当于线性方程中的偏差, 默认是0.
  - borderType 边界类型.一般不设.

# OpenCV图像卷积操作
import cv2
import numpy as np#导入图片
img = cv2.imread('./dog.jpeg')# 相当于原始图片中的每个点都被平均了一下, 所以图像变模糊了.
kernel = np.ones((5, 5), np.float32) / 25
# ddepth = -1 表示图片的数据类型不变
dst = cv2.filter2D(img, -1, kernel)# 很明显卷积之后的图片模糊了.
cv2.imshow('img', np.hstack((img, dst)))cv2.waitKey(0)
cv2.destroyAllWindows()

每个像素都变为周围像素的均值,所以图像模糊了

二、 方盒滤波与均值滤波

- boxFilter(src, ddepth, ksize, dst, anchor, normalize, borderType) 方盒滤波. 

- 方盒滤波的卷积核的形式如下:

  - normalize = True时, a = 1 / (W * H) 滤波器的宽高

  - normalize = False是. a = 1

一般情况我们都使用normalize = True的情况. 这时 方盒滤波 等价于 均值滤波

- blur(src, ksize, dst, anchor, borderType)  均值滤波.

import cv2
import numpy as np#导入图片
img = cv2.imread('./dog.jpeg')# kernel = np.ones((5, 5), np.float32) / 25
# ddepth = -1 表示图片的数据类型不变
dst = cv2.blur(img, (5, 5))# 很明显卷积之后的图片模糊了.
cv2.imshow('img', img)
cv2.imshow('dst', dst)cv2.waitKey(0)
cv2.destroyAllWindows()

三、高斯滤波

高斯滤波的核心思想是让临近的像素具有更高的重要度. 对周围像素计算加权平均值, 较近的像素具有较大的权重值.

要理解高斯滤波首先要知道什么是高斯函数.高斯函数在是符合高斯分布(也叫正态分布)的数据的概率密度函数.画出来长这样子:

 高斯函数的特点是以x轴某一点(这一点称为均值)为对称轴, 越靠近中心数据发生的概率越高, 最终形成一个两边平缓, 中间陡峭的钟型(有的地方也叫帽子)图形.

高斯函数的一般形式为:

高斯滤波就是使用符合高斯分布的卷积核对图片进行卷积操作. 所以高斯滤波的重点就是如何计算符合高斯分布的卷积核, 即高斯模板.

假定中心点的坐标是(0,0),那么取距离它最近的8个点坐标,为了计算,需要设定σ的值。假定σ=1.5,则模糊半径为1的高斯模板就算如下:

我们可以观察到越靠近中心, 数值越大, 越边缘的数值越小.符合高斯分布的特点.

通过高斯函数计算出来的是概率密度函数, 所以我们还要确保这九个点加起来为1,这9个点的权重总和等于0.4787147,因此上面9个值还要分别除以0.4787147,得到最终的高斯模板。

注: 有些整数高斯模板是在归一化后的高斯模板的基础上每个数除上左上角的值, 然后取整.

有了卷积核, 计算高斯滤波就简单了.假设现有9个像素点,灰度值(0-255)的高斯滤波计算如下:

将这9个值加起来,就是中心点的高斯滤波的值。对所有点重复这个过程,就得到了高斯模糊后的图像。

- GaussianBlur(src, ksize, sigmaX, dst, sigmaY, borderType) 

  - kernel 高斯核的大小.
  - sigmaX, X轴的标准差
  - sigmaY, Y轴的标准差, 默认为0, 这时sigmaY = sigmaX
  - 如果没有指定sigma值, 会分别从ksize的宽度和高度中计算sigma.

- 选择不同的sigma值会得到不同的平滑效果, sigma越大, 平滑效果越明显.

- 没有指定sigma时, ksize越大, 平滑效果越明显

  # 高斯滤波import cv2import numpy as np#导入图片img = cv2.imread('./gaussian.png')dst = cv2.GaussianBlur(img, (5, 5), sigmaX=1)cv2.imshow('img', np.hstack((img, dst)))cv2.waitKey(0)cv2.destroyAllWindows()


四、中值滤波

中值滤波是一种非线性的信号处理方法,所以它是一种非线性滤波器,也是一种统计排序滤波器。它将每一像素点的灰度值设置为该点某邻域窗口内的所有像素点灰度值的中值


目的:中值滤波对孤立的噪声像素即椒盐噪声、脉冲噪声具有良好的滤波效果,可以保持图像的边缘特性,不会使图像产生显著的模糊。


基本原理/思想:中值滤波是把数字图像或数字序列中一点的值用该点的一个邻域中各点值的中值代替,让周围的像素值接近真实值,从而消除孤立的噪声点。举个例子:
 

# 中值滤波
import cv2
import numpy as np#导入图片
img = cv2.imread('./papper.png')# 注意这里的ksize就是一个数字
dst = cv2.medianBlur(img, 5)cv2.imshow('img', np.hstack((img, dst)))cv2.waitKey(0)
cv2.destroyAllWindows()

五、双边滤波

双边滤波对于图像的边缘信息能过更好的保存。其原理为一个与空间距离相关的高斯函数与一个灰度距离相关的高斯函数相乘。

双边滤波本质上是高斯滤波, 双边滤波和高斯滤波不同的就是:双边滤波既利用了位置信息又利用了像素信息来定义滤波窗口的权重。而高斯滤波只用了位置信息.

对于高斯滤波,仅用空间距离的权值系数核与图像卷积后,确定中心点的灰度值。即认为离中心点越近的点,其权重系数越大。

双边滤波中加入了对灰度信息的权重,即在邻域内,灰度值越接近中心点灰度值的点的权重更大,灰度值相差大的点权重越小。此权重大小,则由值域高斯函数确定。

 两者权重系数相乘,得到最终的卷积模板。由于双边滤波需要每个中心点邻域的灰度信息来确定其系数,所以其速度与比一般的滤波慢很多,而且计算量增长速度为核大小的平方。

双边滤波可以保留边缘, 同时可以对边缘内的区域进行平滑处理.

双边滤波的作用就相当于做了美颜.

- bilateralFilter(src, d, sigmaColor, sigmaSpace[, dst[, borderType]])
  - sigmaColor是计算像素信息使用的sigma
  - sigmaSpace是计算空间信息使用的sigma

  # 双边滤波# 中值滤波import cv2import numpy as np#导入图片img = cv2.imread('./lena.png')dst = cv2.bilateralFilter(img, 7, 20, 50)cv2.imshow('img', np.hstack((img, dst)))cv2.waitKey(0)cv2.destroyAllWindows()

 

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

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

相关文章

零基础学前端(四)重点讲解 CSS

1. 该篇适用于从零基础学习前端的小白 2. 初学者不懂代码得含义也要坚持模仿逐行敲代码,以身体感悟带动头脑去理解新知识 3. 初学者切忌,不要眼花缭乱,不要四处找其它文档,要坚定一个教授者的方式,将其学通透&#xff…

免费和开源的机器翻译软件LibreTranslate

什么是 LibreTranslate ? LibreTranslate 免费开源机器翻译 API,完全自托管。与其他 API 不同,它不依赖于 Google 或 Azure 等专有提供商来执行翻译。它的翻译引擎由开源 Argos Translate 库提供支持。 这个软件在 2022 年 3 月的时候折腾过&…

使用Langchain+GPT+向量数据库chromadb 来创建文档对话机器人

使用LangchainGPT向量数据库chromadb 来创建文档对话机器人 一.效果图如下: 二.安装包 pip install langchainpip install chromadbpip install unstructuredpip install jieba三.代码如下 #!/usr/bin/python # -*- coding: UTF-8 -*-import os # 导入os模块&…

【Git】万字git与gitHub

🎄欢迎来到边境矢梦的csdn博文🎄 🎄本文主要梳理在git和GitHub时的笔记与感言 🎄 🌈我是边境矢梦,一个正在为秋招和算法竞赛做准备的学生🌈 🎆喜欢的朋友可以关注一下🫰&…

QT子线程或自定义类操作访问主界面UI控件的几种方法

前言 QT创建窗体工程,一般在MainWindow或Dialog类里可以直接通过ui指针访问控件,但是添加新的类后又如何访问呢,可以通过以下几种方式: 将ui指针公开后直接访问 (1)例如有个自己定义的类CustomCl…

Android 官方屏幕适配之ScreenMatch

背景: Android 项目的一个app需要适配手机平板,为了一套UI和可以适配2个不同屏幕,记录一个适配的技巧: 前提,使用这个框架:GitHub - wildma/ScreenAdaptation: :fire:一种非常好用的 Android 屏幕适配——…

Leetcode: 645.错误的集合 题解【超详细】

题目 集合 s 包含从 1 到 n 的整数。不幸的是,因为数据错误,导致集合里面某一个数字复制了成了集合里面的另外一个数字的值,导致集合 丢失了一个数字 并且 有一个数字重复 。 给定一个数组 nums 代表了集合 S 发生错误后的结果。 请你找出重复…

【计算机视觉 | 目标检测】arxiv 计算机视觉关于目标检测的学术速递(9 月 15 日论文合集)

文章目录 一、检测相关(6篇)1.1 ALWOD: Active Learning for Weakly-Supervised Object Detection1.2 mEBAL2 Database and Benchmark: Image-based Multispectral Eyeblink Detection1.3 Co-Salient Object Detection with Semantic-Level Consensus Extraction and Dispersio…

[npm]package.json文件

[npm]package.json文件 生成 package.jsonpackage.json 必须属性nameversion 描述信息descriptionkeywordsauthorcontributorshomepagerepositorybugs 依赖配置dependenciesdevDependenciespeerDependenciesoptionalDependenciesbundledDependenciesengines 脚本配置scriptscon…

spring boot 使用AOP+自定义注解+反射实现操作日志记录修改前数据和修改后对比数据,并保存至日志表

一、添加aop starter依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-aop</artifactId> </dependency>二&#xff1a;自定义字段翻译注解。&#xff08;修改功能时&#xff0c;需要显示如…

SpringBoot整合Easy-ES实现对ES操作

请确保已有可用的ES&#xff0c;若没有&#xff0c;请移步&#xff1a;Docker安装部署ElasticSearch&#xff08;ES&#xff09; 新建SpringBoot项目 这里是用的springboot版本是2.6.0 引入依赖 <!-- 排除springboot中内置的es依赖,以防和easy-es中的依赖冲突--><…

Python解析MDX词典数据并保存到Excel

原始数据和处理结果&#xff1a; https://gitcode.net/as604049322/blog_data/-/tree/master/mdx 下载help.mdx词典后&#xff0c;我们无法直接查看&#xff0c;我们可以使用readmdict库来完成对mdx文件的读取。 安装库&#xff1a; pip install readmdict对于Windows平台还…