图像变换(Image transformations)

1 图像变换和图像滤波(image filtering)的区别

1.1 图像滤波

图像滤波改变像素点的灰度值,不改变像素点的坐标,如下图所示。

用函数可表示为:

g(x)=h(f(x))

其中f(x)表示原图,h(x)表示滤波器

1.2 图像变换

图像变换改变像素点的坐标,不改变像素点的灰度值,如下图所示。

用函数可表示为:

g(x)=f(h(x))

其中f(x)表示原图,h(x)为图像变换

 

2、线性变换(linear transformations)

假设 表示原图,p' 表示变换后的图像,T为变换矩阵,即有:p=T(p')

T=\begin{bmatrix} a & b\\ c&d \end{bmatrix}

线性变换主要分为以下几种:伸缩(scaling),旋转(rotation),镜像(Mirror),错切(shear)

2.1 伸缩(scaling)

假设图像被放大了s,则变换矩阵可以表示为:

S=\begin{bmatrix} s &0 \\ 0& s \end{bmatrix}

2.2 旋转(rotation)

图像逆时针旋转 \theta , 旋转矩阵可以表示为:

如果顺时针转回来,旋转矩阵可以表示为:

T=R^{-1}=R^{T}

2.3 镜像(Mirror)

2.3.1 关于Y轴镜像

2.3.2 关于Y=X轴镜像

2.4 错切(shear)

2.4.1 沿X方向的错切

T=\begin{bmatrix} 1 &-tan\alpha \\ 0& 1 \end{bmatrix}

2.4.2 沿Y方向的错切

T=\begin{bmatrix} 1 &0 \\ -tan\alpha & 1 \end{bmatrix}

2.5 线性变换的特性

  • 原点映射到原点
  • 线映射到线
  • 平行线保持平行
  • 比率保持
  • 可以组合变换

 

3、仿射变换(仿射变换)

线性变换无法表示图像的平移(translation)


其变换无法用一个2*2的矩阵表示。

3.1 齐次坐标(homogeneous coordinates)

如果增加坐标轴,在更高的维度表示就可以了。

或者

\begin{bmatrix} x\\ y\\ w \end{bmatrix}\Rightarrow \begin{bmatrix} x/w\\ y/w\\ 1 \end{bmatrix}

其含义如下图所示:

增加一个坐标后,图像的变换可以表示为:

如果变换矩阵的最后一行为 [0,0,1] ,则被称为仿射变换。

3.2 平移(translation)

平移变换可以使用如下等式表示:

3.3 基本的仿射变换

仿射变换=线性变换+平移

3.4 仿射变换的性质

  • 仿射变换包含线性变换和平移
  • 原点不一定映射到原点
  • 线映射到线
  • 平行线保持平行
  • 比率保持
  • 可以组合变换

 

4、射影变换(Projective Transformations)

4.1 射影变换的一般形式

仿射变换的变换矩阵一般形式为:

射影变换的一般等式:

上面等式变形过程中,默认 gx+hy+1\neq 0

4.2 图像有两条边平行的情况

如果图像有两条边平行的情况,则gx+hy+1= 0

4.3 射影变换可以转换图像的视角

4.4 射影变换的性质

  • 射影变换包含仿射变换和射影扭曲
  • 原点不一定映射到原点
  • 线映射到线
  • 平行线不一定保持平行
  • 比率不一定保持不变
  • 可以组合变换

 

5、Image Warping

已知图像的变换矩阵和原图,如何计算变换后的图像

用公式表示:

原图f(x,y),变换(x’,y’) = T(x,y),求 g(x’,y’) 或 f(T(x,y))?

5.1 Forward Warping

直接把原图的每个坐标变换到新的位置上,如果变换后的坐标不是整数,则就近取整。

这种方法会导致变换后的图像出现空洞及重叠

5.2 Inverse Warping

对于新图像的坐标(x,y), 用逆向的映射矩阵T^{-1}找到原图像中对应的点,如果算出来的原图像的点不在格子上,就用插值方法获得像素值。

 

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
以下是使用PyTorch实现CNN图像分类的示例代码: ```python import torch import torch.nn as nn import torch.optim as optim import torchvision import torchvision.transforms as transforms # Define the convolutional neural network architecture class Net(nn.Module): def __init__(self): super(Net, self).__init__() self.conv1 = nn.Conv2d(3, 6, 5) self.pool = nn.MaxPool2d(2, 2) self.conv2 = nn.Conv2d(6, 16, 5) 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 = self.pool(torch.relu(self.conv1(x))) x = self.pool(torch.relu(self.conv2(x))) x = x.view(-1, 16 * 5 * 5) x = torch.relu(self.fc1(x)) x = torch.relu(self.fc2(x)) x = self.fc3(x) return x # Load the CIFAR-10 dataset and apply transformations transform = transforms.Compose([transforms.ToTensor(), transforms.Normalize((0.5,0.5,0.5), (0.5,0.5,0.5))]) trainset = torchvision.datasets.CIFAR10(root='./data', train=True, download=True, transform=transform) trainloader = torch.utils.data.DataLoader(trainset, batch_size=4, shuffle=True, num_workers=2) testset = torchvision.datasets.CIFAR10(root='./data', train=False, download=True, transform=transform) testloader = torch.utils.data.DataLoader(testset, batch_size=4, shuffle=False, num_workers=2) # Define the loss function and optimizer net = Net() criterion = nn.CrossEntropyLoss() optimizer = optim.SGD(net.parameters(), lr=0.001, momentum=0.9) # Train the network for epoch in range(2): running_loss = 0.0 for i, data in enumerate(trainloader, 0): inputs, labels = data optimizer.zero_grad() outputs = net(inputs) loss = criterion(outputs, labels) loss.backward() optimizer.step() running_loss += loss.item() if i % 2000 == 1999: print('[%d, %5d] loss: %.3f' % (epoch + 1, i + 1, running_loss / 2000)) running_loss = 0.0 print('Finished Training') # Test the network on test dataset correct = 0 total = 0 with torch.no_grad(): for data in testloader: images, labels = data outputs = net(images) _, predicted = torch.max(outputs.data, 1) total += labels.size(0) correct += (predicted == labels).sum().item() print('Accuracy of the network on the 10000 test images: %d %%' % ( 100 * correct / total)) ``` 在此示例中,我们使用了CIFAR-10数据集,它包含60000张32x32像素的彩色图像,共有10个类别。我们定义了一个包含两个卷积层和三个全连接层的CNN模型,使用交叉熵损失函数和随机梯度下降优化器进行训练。我们还在训练数据上进行了两个epoch,并在测试数据上进行了测试,以评估模型的准确性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

吃瓜群众110

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值