【数字图像处理】简单粗暴理解伽马变换(附python代码)

1 概念

伽马(Gamma)变换又称幂律变换,是数字图像处理中的一种常用技术,其作用主要是调节图像的亮度,从而增强图像的对比度。日常生活中我们使用一些图像处理软件调整图片的亮度,其实使用的就是伽马变换。

喜欢打游戏的可能对这样一个场景并不陌生,许多主机游戏第一次启动时会让用户调整显示亮度直到能隐约看见某个东西(某个文字之类的),这其实就是在应用伽马变换调节屏幕亮度,以输出更佳的画面。

其实伽马变换的原理是非常简单的,下面就以最通俗易懂的方式来介绍一下。

2 原理

2.1 数学原理

伽马变换的形式是非常简单的,就是如下公式: s = c r γ ,   r ∈ [ 0 , 1 ] s=cr^\gamma,\ r \in [0,1] s=crγ, r[0,1]其中, r r r是某个点变换前的像素值, s s s是变换后的像素值, c c c γ \gamma γ是正常数( γ \gamma γ 其实就是伽马)。 一般我们会令c等于1。 在一些情况下,考虑到偏移问题(当输入为0时的一个可度量输出), r r r这一项也可以写成 ( r + ε ) (r+\varepsilon) (r+ε

LeNet是由Yann LeCun在1998年提出的经典卷积神经网络模型,被广泛应用于手写数字识别、文本识别等领域。LeNet5是LeNet的一种改进版本,主要的改进在于增加了卷积层和池化层,并使用了Sigmoid和Tanh等激活函数。 下面是LeNet和LeNet5的详细结构和代码实现。 LeNet结构: 输入层(32x32的图像) => 卷积层1(6个5x5的卷积核)=> 池化层1(2x2的最大池化)=> 卷积层2(16个5x5的卷积核)=> 池化层2(2x2的最大池化)=> 全连接层1(120个神经元)=> 全连接层2(84个神经元)=> 输出层(10个神经元) LeNet5结构: 输入层(32x32的图像)=> 卷积层1(6个5x5的卷积核)=> 池化层1(2x2的最大池化)=> 卷积层2(16个5x5的卷积核)=> 池化层2(2x2的最大池化)=> 卷积层3(120个5x5的卷积核)=> 全连接层1(84个神经元)=> 输出层(10个神经元) 完整代码实现: ```python import torch import torch.nn as nn import torch.optim as optim import torch.nn.functional as F class LeNet(nn.Module): def __init__(self): super(LeNet, self).__init__() self.conv1 = nn.Conv2d(1, 6, kernel_size=5) self.pool1 = nn.MaxPool2d(kernel_size=2) self.conv2 = nn.Conv2d(6, 16, kernel_size=5) self.pool2 = nn.MaxPool2d(kernel_size=2) self.fc1 = nn.Linear(16*5*5, 120) self.fc2 = nn.Linear(120, 84) self.fc3 = nn.Linear(84, 10) def forward(self, x): x = F.relu(self.conv1(x)) x = self.pool1(x) x = F.relu(self.conv2(x)) x = self.pool2(x) x = x.view(-1, 16*5*5) x = F.relu(self.fc1(x)) x = F.relu(self.fc2(x)) x = self.fc3(x) return x class LeNet5(nn.Module): def __init__(self): super(LeNet5, self).__init__() self.conv1 = nn.Conv2d(1, 6, kernel_size=5) self.pool1 = nn.MaxPool2d(kernel_size=2) self.conv2 = nn.Conv2d(6, 16, kernel_size=5) self.pool2 = nn.MaxPool2d(kernel_size=2) self.conv3 = nn.Conv2d(16, 120, kernel_size=5) self.fc1 = nn.Linear(120, 84) self.fc2 = nn.Linear(84, 10) def forward(self, x): x = F.relu(self.conv1(x)) x = self.pool1(x) x = F.relu(self.conv2(x)) x = self.pool2(x) x = F.relu(self.conv3(x)) x = x.view(-1, 120) x = F.relu(self.fc1(x)) x = self.fc2(x) return x ``` 以上就是LeNet和LeNet5的结构详解和完整代码实现。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值