卷积的意义及其应用

news2024/9/29 7:30:12

卷积的意义及其应用

卷积的定义

我们将形如
∫ − ∞ ∞ f ( τ ) g ( x − τ ) d τ \int^\infty_{-\infty} f(τ)g(x-τ)dτ f(τ)g(xτ)dτ
的式子称之为f(x)与g(x)的卷积记为
h ( x ) = ( f ∗ g ) ( x ) h(x) = (f * g)(x) h(x)=(fg)(x)
我们可以将它转化成离散形式的式子,like:
∑ i = − ∞ ∞ x ( i ) h ( n − i ) \sum^\infty_{i=-\infty}x(i)h(n-i) i=x(i)h(ni)
这是一个很明显的将一个序列倒置,然后相乘的操作。我们就用如此的思想来引入我们的第一种引用——联合概率分布

卷积的应用——联合概率分布

我们想象两颗骰子,当我们掷出它们的时候对于每个骰子的六个面,有如下概率序列
[ 1 6 , 1 6 , 1 6 , 1 6 , 1 6 , 1 6 ] [\frac{1}{6}, \frac{1}{6}, \frac{1}{6}, \frac{1}{6}, \frac{1}{6}, \frac{1}{6}] [61,61,61,61,61,61]
它们的序号计数从1开始
两个骰子的点数概率序列我们分别命名为
P ( x ) , Q ( x ) P(x), Q(x) P(x),Q(x)
那么之前的离散型卷积我们可以选择一个位置写成如下形式,并且根据实际情况调节上下界,式子如
h ( 4 ) = ∑ i = 1 3 P ( i ) Q ( 4 − i ) h(4) = \sum^{3}_{i=1}P(i)Q(4-i) h(4)=i=13P(i)Q(4i)
这个描述的是两颗骰子投出4点的概率。
现在我们假设存在两个概率密度函数,定义域为x∈R,那么
∫ − ∞ ∞ f ( τ ) g ( x − τ ) d τ \int^\infty_{-\infty} f(τ)g(x-τ)dτ f(τ)g(xτ)dτ
这个式子就可以很清晰的表示他俩的联合分布的密度函数了。
我么可以用python代码实现它

import numpy as np

def dice_probability(num_dice):
    # 构建骰子的点数概率分布
    dice = np.ones(6) / 6

    # 迭代卷积运算
    result = dice
    for _ in range(num_dice - 1):
        result = np.convolve(result, dice)

    return result

# 输入两个骰子进行卷积计算
num_dice = 2
probabilities = dice_probability(num_dice)

# 打印点数概率分布序列
for i, p in enumerate(probabilities, num_dice):
    print(f"点数 {i}: 概率 {p:.4f}")

卷积的应用——信号处理

卷积还有另一个重要的作用,那就是信号处理。
我们假设存在一个线性信号系统,在其中有冲击函数f(t)和一个响应函数g(t)。
这个时候我们再去观察
∫ − ∞ ∞ f ( τ ) g ( x − τ ) d τ \int^\infty_{-\infty} f(τ)g(x-τ)dτ f(τ)g(xτ)dτ
我们不难知道其中的g(x-τ)其实是在x时,τ时接受的冲击的响应余留多少
我们知晓这个观点,那我们就可以写一个简单的python程序来计算这个冲击函数对应的真正的响应函数,(之前的g(t)其实是对于单位冲击而言的),代码如下

import numpy as np
import matplotlib.pyplot as plt


def continuous_convolution(signal_1, signal_2, dt):
    conv = np.convolve(signal_1, signal_2) * dt
    t = np.arange(0, (len(signal_1) + len(signal_2) - 1) * dt, dt)
    return t, conv

# 定义输入信号的冲击函数和单位冲击响应函数
t_impulse = np.arange(-5, 5, 0.01)
impulse = np.zeros_like(t_impulse)
impulse[np.abs(t_impulse) < 0.001] = 1

t_response = np.arange(0, 10, 0.01)
response = np.exp(-t_response)

# 进行连续卷积计算
t_total, total_response = continuous_convolution(impulse, response, 0.01)

# 裁剪信号长度以匹配卷积结果
total_response = total_response[:len(t_total)]

# 创建一个包含三个子图的图形窗口
fig, axs = plt.subplots(1, 3, figsize=(12, 4))

# 绘制冲击函数的图像
axs[0].plot(t_impulse, impulse)
axs[0].set_xlabel('Time')
axs[0].set_ylabel('Amplitude')
axs[0].set_title('Impulse Function')

# 绘制单位冲击响应函数的图像
axs[1].plot(t_response, response)
axs[1].set_xlabel('Time')
axs[1].set_ylabel('Amplitude')
axs[1].set_title('Unit Impulse Response')

# 绘制总响应函数的图像
axs[2].plot(t_total[:-1], total_response)
axs[2].set_xlabel('Time')
axs[2].set_ylabel('Amplitude')
axs[2].set_title('Total Response')

# 调整子图之间的间距
plt.tight_layout()

# 展示图像
plt.show()

结果如下
在这里插入图片描述
卷积为我们忠实的展现了其在线性信号系统响应模拟上的能力

卷积的应用——图像处理

我们终于循序渐进的到了这一步,卷积——>卷积核。熟悉CNN网络的同学一定对这个词并不陌生,至于为什么把这个放到信号处理/概率后面来讲,因为卷积核实际上就是一个滤波器!!!!是对图像像素矩阵的滤波器!!!,每一次的更新迭代卷积核里的参数,是为了更方便的提取特征,换句话说,卷积核里的值,其实就是对每个像素点可能对这个问题提供贡献的概率的概率分布,每次迭代是迭代它的权重,我甚至可以将这个分布按我所想进行设计,比如说我要我可以将一个图片迅速的转化成速写
代码如下

import numpy as np
from PIL import Image


# 定义卷积操作函数
def convolve(image, kernel):
    image_height, image_width = image.shape
    kernel_height, kernel_width = kernel.shape

    output = np.zeros((image_height, image_width))

    # 滑动窗口进行卷积操作
    for i in range(image_height - kernel_height + 1):
        for j in range(image_width - kernel_width + 1):
            window = image[i:i + kernel_height, j:j + kernel_width]
            output[i, j] = np.sum(window * kernel)

    return output


# 定义速写风格的卷积核
sketch_kernel = np.array([[0, -1, 0],
                          [-1, 5, -1],
                          [0, -1, 0]])

# 从外部读取图像
image_path = "OIP-C.jpg"  # 替换为你的图像路径
image = Image.open(image_path).convert("L")  # 使用convert("L")将彩色图像转为灰度图像

# 将图像转为numpy数组
image_array = np.array(image)

# 执行卷积操作
sketch_image = convolve(image_array, sketch_kernel)

# 显示结果
image.show()  # 显示原始图像
Image.fromarray(sketch_image).show()  # 显示速写风格图像

下面的顺序为,原图,灰度化的原图,经卷积核的图
只是原图
在这里插入图片描述
在这里插入图片描述
是不是要比灰度图更像铅笔画的呢,模糊的树丛也不模糊了?
这就是卷积核的作用,改变每个像素的权重参数,使其变成一个和卷积核的联合分布

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

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

相关文章

js开发技巧

1. 初始化数组 如果想要初始化一个指定长度的一维数组&#xff0c;并指定默认值&#xff0c;可以这样&#xff1a; const array Array(6).fill(); // [, , , , , ] 如果想要初始化一个指定长度的二维数组&#xff0c;并指定默认值&#xff0c;可以这样&#xff1a; const…

【尚硅谷】第01章:随堂复习与企业真题(Java语言概述)

来源&#xff1a;尚硅谷Java零基础全套视频教程(宋红康2023版&#xff0c;java入门自学必备) 基本都是宋老师发的资料里面的内容&#xff0c;只不过补充几个资料里没直接给出答案的问题的答案。 不想安装markdown笔记的app所以干脆在这里发一遍。 第01章&#xff1a;随堂复习…

电路原理分析1

d2的作用是提供一个1.25v的电平 r3、r4的作用都是限流 c1是滤波 运放的4、8脚是常规的外围 这个运放是一个运算放大电路 具体计算是这样的&#xff1a; 按照虚短原则&#xff0c;输入的信号Uinu1,输出的信号Uoutu3 按照虚断原则&#xff0c;i1i2i5i5 u1/r2i1i5&#xff…

windows使用多账户Git,多远程仓库版本管理

1 清除全局配置 git config --global --list // 看一下是否配置过user.name 和 user.email git config --global --unset user.name // 清除全局用户名 git config --global --unset user.email // 清除全局邮箱 2 本地仓库&#xff0c;每个远程对应的本地仓库目录下执行 $…

Redis缓存击穿问题以及解决方案

Redis缓存击穿问题以及解决方案 前言一、什么是Redis缓存击穿二、解决方案1.使用锁来解决使用锁的流程&#xff1a;核心思路&#xff1a;思路流程图&#xff1a;操作的锁的代码&#xff1a;业务的实现&#xff1a; 2.逻辑过期来解决思路分析&#xff1a;解决流程&#xff1a;业…

YOLOv5改进系列(17)——更换IoU之MPDIoU(ELSEVIER 2023|超越WIoU、EIoU等|实测涨点)

【YOLOv5改进系列】前期回顾: YOLOv5改进系列(0)——重要性能指标与训练结果评价及分析 YOLOv5改进系列(1)——添加SE注意力机制

【数据结构】_5.栈

目录 1. 概念 2. 栈的使用 2.1 方法 2.2 示例 3. 栈的模拟实现 4. 栈的应用场景 4.1 题目1&#xff1a;不可能的出栈序列 4.2 题目2&#xff1a;逆序打印单链表 4.3 题目3&#xff1a;逆波兰表达式求值 4.4 题目4&#xff1a;括号匹配 4.5 题目5&#xff1a;栈的压入…

如何构建高效的接口自动化测试框架

在选择接口测试自动化框架时&#xff0c;需要根据团队的技术栈和项目需求来综合考虑。对于测试团队来说&#xff0c;使用Python相关的测试框架更为便捷。无论选择哪种框架&#xff0c;重要的是确保 框架功能完备&#xff0c;易于维护和扩展&#xff0c;提高测试效率和准确性。今…

最适合新手的SpringBoot+SSM项目《苍穹外卖》实战—(五)员工管理

黑马程序员最新Java项目实战《苍穹外卖》&#xff0c;最适合新手的SpringBootSSM的企业级Java项目实战。 新增员工 设计 DTO 类 我们需要根据新增员工接口设计对应的 DTO 类去接收前端传递的参数&#xff0c;前端传递参数列表如下&#xff1a; 注意&#xff1a; 当前端提交的…

C++ 成员初始化列表和new运算符的应用

输出一个学生的学号&#xff0c;姓名&#xff0c;性别和出生年月日 class Date { public:Date(int y, int m, int d) :m_year(y), m_month(m), m_day(d) {}void Print(){cout << m_year << "/" << m_month << "/" << m_day…

第四章 No.1树状数组的原理与使用

文章目录 应用问题原理树状数组练习题241. 楼兰图腾242. 一个简单的整数问题243. 一个简单的整数问题2244. 谜一样的牛 线段树的反面&#xff1a;树状数组原理复杂&#xff0c;实现简单 应用问题 支持两个操作&#xff1a;快速求前缀和任意地修改某个数&#xff0c;时间复杂度…

520 · 一致性哈希 II

链接&#xff1a;LintCode 炼码 - ChatGPT&#xff01;更高效的学习体验&#xff01; 题解&#xff1a; class Solution{private:int n;const int mVirtualNodeCount;map<int, int> mVirtualNodeToMachineIdMap;set<int> mVirtualNodeSet;public:Solution(int n…

SpringBoot的三层架构以及IOCDI

目录 一、IOC&DI入门 二、三层架构 数据库访问层 业务逻辑层 控制层 一、IOC&DI入门 在软件开发中&#xff0c;IOC&#xff08;Inversion of Control&#xff09;和DI&#xff08;Dependency Injection&#xff09;是密切相关的概念。 IOC&#xff08;控制反转&a…

CAN学习笔记2:CAN简介

CAN 1 概述 CAN(Controller Area Network),是 ISO 国际标准化的串行通信协议,目的是适应汽车“减少线束的数量”、“通过多个网络进行大量数据的高速传输”的需求。 低速 CAN(ISO11519)通信速率 10~125Kbps&#xff0c;总线长度可达 1000米. 高速 CAN(ISO11898)通信速率 125~…

cnn卷积神经网络(基础)

convolutional neural networks 特征提取&#xff08;卷积、下采样&#xff09;->分类器 &#xff08;全连接&#xff09; 卷积过程 依次进行数乘 &#xff08;每个相同位置上的数字相乘再加和&#xff09; 左右数乘矩阵channel数量要一样&#xff0c;输出得到一个通道 卷…

吴师傅教你几招极速清理C盘,高能操作绝不让你失望!

电脑使用久了&#xff0c;C盘堆积的垃圾过多&#xff1b;每天上网会给电脑带来很多临时文件&#xff0c;这些垃圾文件不清理掉时间久了就会影响到电脑的运行速度&#xff1b;也会导致C盘变红&#xff0c;空间不足。那么&#xff0c;电脑C盘满了如何清理呢&#xff1f;教你几招极…

SpringBoot 如何进行 统一异常处理

在Spring Boot中&#xff0c;可以通过自定义异常处理器来实现统一异常处理。异常处理器能够捕获应用程序中抛出的各种异常&#xff0c;并提供相应的错误处理和响应。 Spring Boot提供了ControllerAdvice注解&#xff0c;它可以将一个类标记为全局异常处理器。全局异常处理器能…

NICE-SLAM: Neural Implicit Scalable Encoding for SLAM论文阅读

论文信息 标题&#xff1a;NICE-SLAM: Neural Implicit Scalable Encoding for SLAM 作者&#xff1a;Zihan Zhu&#xff0c; Songyou Peng&#xff0c;Viktor Larsson — Zhejiang University 来源&#xff1a;CVPR 代码&#xff1a;https://pengsongyou.github.io/nice-slam…

ARM单片机中断处理过程解析

前言 中断&#xff0c;在单片机开发中再常见不过了。当然对于中断的原理和执行流程都了然于胸&#xff0c;那么对于ARM单片机中断的具体处理行为&#xff0c;你真的搞清楚了吗&#xff1f; 今天来简单聊一聊&#xff0c;ARM单片机中断处理过程中的具体行为是什么样的&#xf…

spring5源码篇(13)——spring mvc无xml整合tomcat与父子容器的启动

spring-framework 版本&#xff1a;v5.3.19 文章目录 整合步骤实现原理ServletContainerInitializer与WebApplicationInitializer父容器的启动子容器的启动 相关面试题 整合步骤 试想这么一个场景。只用 spring mvc&#xff08;确切来说是spring-framework&#xff09;&#x…