0.卷积
首先介绍一下我们要用到的卷积:看大佬写的文章,没耐心可忽略
PyTorch 27.2D卷积,nn.Conv2d和F.conv2d - 知乎
1. 怎么使用
以三张图像融合为例,这里用到的是F.conv2d(需要的话参照上面的文章换成别的卷积)。
思路:先用一个平滑卷积对原始图像进行去噪,这一步也会导致图像变模糊,所以用一个锐化卷积提升图像质量,再用一个边缘检测卷积。不一定是效果最好的,同理可换。
另外请注意:在卷积设定中 Guss_kernel = Guss_kernel.repeat(3, 3, 1, 1),第一个位置的3是输出维度,第二个位置的3是输入维度,后面两个是卷积核大小。
最后附上可能需要的文章:
苦改多日,直接附上源码,如果有用的话记得三连。
def apply_convolution(self, img1, img2, img3):
# 使用 F.conv2d 执行卷积操作,卷积需要输入为 [batch_size, channels, height, width]
img1 = img1.unsqueeze(0).float()
img2 = img2.unsqueeze(0).float()
img3 = img3.unsqueeze(0).float()
Guss_kernel = torch.tensor( #平滑
[[1/9, 1/9, 1/9],
[1/9, 1/9, 1/9],
[1/9, 1/9, 1/9]],
dtype=torch.float32).unsqueeze(0).unsqueeze(0) # 调整形状以匹配卷积的输入格式 (1, 1, 3, 3)
Guss_kernel = Guss_kernel.repeat(3, 3, 1, 1)
img1 = F.conv2d(img1, Guss_kernel, padding=1)
img2 = F.conv2d(img2, Guss_kernel, padding=1)
img3 = F.conv2d(img3, Guss_kernel, padding=1)
sharpen_kernel = torch.tensor([ #锐化
[0, -1, 0],
[-1, 5, -1],
[0, -1, 0]],
dtype=torch.float32).unsqueeze(0).unsqueeze(0)
sharpen_kernel = sharpen_kernel.repeat( 3, 3, 1, 1)
img1 = F.conv2d(img1, sharpen_kernel, padding=1)
img2 = F.conv2d(img2, sharpen_kernel, padding=1)
img3 = F.conv2d(img3, sharpen_kernel, padding=1)
Laplace_kernel = torch.tensor([ #检测各个方向的边缘
[0, 1, 0],
[1, -4, 1],
[0, 1, 0]],
dtype=torch.float32).unsqueeze(0).unsqueeze(0)
Laplace_kernel = Laplace_kernel.repeat(3, 3, 1, 1)
img1 = F.conv2d(img1, Laplace_kernel, padding=1)
img2 = F.conv2d(img2, Laplace_kernel, padding=1)
img3 = F.conv2d(img3, Laplace_kernel, padding=1)
img = (img1 + img2 + img3) / 3
# 转换为 numpy 数组以便显示
img = img.squeeze(0).permute(1, 2, 0).detach().numpy()
img = np.clip(img, 0, 255)# 确保图像的像素值范围在 [0, 255]
img = np.uint8(img)# 转换为 uint8 类型
if img.shape[2] == 1:
img = img.squeeze(2) # 移除最后一个维度
img = Image.fromarray(np.uint8(img))
img = self.transform2(img)
return img