怎么用卷积进行图像融合?内附源代码

0.卷积

首先介绍一下我们要用到的卷积:看大佬写的文章,没耐心可忽略

PyTorch 27.2D卷积,nn.Conv2d和F.conv2d - 知乎

1. 怎么使用

以三张图像融合为例,这里用到的是F.conv2d(需要的话参照上面的文章换成别的卷积)。

思路:先用一个平滑卷积对原始图像进行去噪,这一步也会导致图像变模糊,所以用一个锐化卷积提升图像质量,再用一个边缘检测卷积。不一定是效果最好的,同理可换。

另外请注意:在卷积设定中 Guss_kernel = Guss_kernel.repeat(3, 3, 1, 1),第一个位置的3是输出维度,第二个位置的3是输入维度,后面两个是卷积核大小。

最后附上可能需要的文章:

【已解决】RuntimeError: Given groups=1, weight of size [512, 1024, 3, 3], expected input[1, 640, 8, 8]...-优快云博客

苦改多日,直接附上源码,如果有用的话记得三连。

    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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值