卷积的意义及其应用

news/2024/11/16 21:43:53/

卷积的意义及其应用

卷积的定义

我们将形如
∫ − ∞ ∞ 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 npdef dice_probability(num_dice):# 构建骰子的点数概率分布dice = np.ones(6) / 6# 迭代卷积运算result = dicefor _ 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 pltdef continuous_convolution(signal_1, signal_2, dt):conv = np.convolve(signal_1, signal_2) * dtt = 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] = 1t_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.shapekernel_height, kernel_width = kernel.shapeoutput = 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.ppmy.cn/news/989067.html

相关文章

目前可以实现用手机操作水质自动采样器吗

利用自动采样器进行水样采集可以说节省很大的人力物力&#xff0c;但是有时为了采到更具代表性的水样&#xff0c;我们需要对沟渠、深井、排污口等特殊场景进行采样。像这些狭小的空间领域采样就有点困难&#xff0c;对现场工作人员就带来了一些难题。所以也需要一款可以在井下…

【Python数据分析】Python常用内置函数(一)

&#x1f389;欢迎来到Python专栏~Python常用内置函数&#xff08;一&#xff09; ☆* o(≧▽≦)o *☆嗨~我是小夏与酒&#x1f379; ✨博客主页&#xff1a;小夏与酒的博客 &#x1f388;该系列文章专栏&#xff1a;Python学习专栏 文章作者技术和水平有限&#xff0c;如果文…

zookeeper集群节点替换方案

Zookeeper集群节点替换 任务描述 Kafka集群依赖的Zookeeper集群中节点替换 解决步骤 解决思路&#xff1a; 先将新节点加入zookeeper集群依次修改Kafka配置并重启依次修改zookeeper配置并重启&#xff08;leader节点最后重启 实践操作&#xff1a; 1&#xff09;操作新机…

JS前端读取本地上传的File文件对象内容(包括Base64、text、JSON、Blob、ArrayBuffer等类型文件)

读取base64图片File file2Base64Image(file, cb) {const reader new FileReader();reader.readAsDataURL(file);reader.onload function (e) {cb && cb(e.target.result);//即为base64结果}; }, 读取text、JSON文件File readText(file, { onloadend } {}) {const re…

Redis简介,设置redis内存大小,设置redis淘汰机制,查看内存占用情况,内存占用分析

为什么使用Redis缓存数据库 我们日常的开发&#xff0c;无非是对数据的处理。程序的定义也可以这样狭义的解释&#xff1a;算法数据。可见数据库是多么重要的工具。但是关系型数据库的读写能力在200-1000次/秒不等&#xff0c;服务器好点可能更多&#xff0c;这导致在高并发的…

draw up a plan

爱情是美好的&#xff0c;却不是唯一的。爱情只是属于个人化的感情。 推荐一篇关于爱情的美文&#xff1a; 在一个小镇上&#xff0c;有一家以制作精美巧克力而闻名的手工巧克力店&#xff0c;名叫“甜蜜之爱”。这家巧克力店是由一位名叫艾玛的年轻女性经营的&#xff0c;她对…

第19节:医学分析,分析轨迹数据以了解视频游戏对人类短期和长期记忆的影响

分析轨迹数据以了解视频游戏对人类短期和长期记忆的影响 1.简介 1.1背景和动机 这些数据是在一项关于探索新奇事物对儿童学习成功的影响的研究中记录的。 研究组由患有不同类型多动症的儿童和对照组组成。 在实验中,两组(患有多动症和对照组)都必须在不同的三天参加研究。…

JAVASE---数据类型与变量

1. 字面常量 常量即程序运行期间&#xff0c;固定不变的量称为常量&#xff0c;比如&#xff1a;一个礼拜七天&#xff0c;一年12个月等。 public class Demo{ public static void main(String[] args){ System.Out.println("hello world!"); System.Out.println(…