power_kaikaige 2023-11-06 21:10 采纳率: 50%
浏览 15
已结题

计算机视觉频域图展示

论文中给的频域图(DCT)是这样的:

img

公式1如下:

img

但我用作者给的代码,生成的图像是这样的:

img

请问,我要做什么处理,才能变成作者那样的?

作者提供的核心代码如下:

import numpy as np
import torch
from torch import nn
from PIL import Image
import torchvision.transforms.functional as F
import torchvision.utils as vutils
class Filter(nn.Module):
    def __init__(self, size, band_start, band_end, use_learnable=True, norm=False):
        super(Filter, self).__init__()
        self.use_learnable = use_learnable

        self.base = nn.Parameter(torch.tensor(generate_filter(band_start, band_end, size)), requires_grad=False)
        if self.use_learnable:
            # 根据size为每一个坐标位置随机生成数字
            self.learnable = nn.Parameter(torch.randn(size, size), requires_grad=True)
            self.learnable.data.normal_(0., 0.1)
            # Todo
            # self.learnable = nn.Parameter(torch.rand((size, size)) * 0.2 - 0.1, requires_grad=True)

        self.norm = norm
        if norm:
            self.ft_num = nn.Parameter(torch.sum(torch.tensor(generate_filter(band_start, band_end, size))), requires_grad=False)

    def forward(self, x):
        if self.use_learnable:
            filt = self.base + norm_sigma(self.learnable)
        else:
            filt = self.base

        if self.norm:
            y = x * filt / self.ft_num
        else:
            y = x * filt
        return y

# 根据图像的尺寸生成傅里叶矩阵
def DCT_mat(size):
    m = [[ (np.sqrt(1./size) if i == 0 else np.sqrt(2./size)) * np.cos((j + 0.5) * np.pi * i / size) for j in range(size)] for i in range(size)]
    return m
# 尺寸范围内设1,否则设0
def generate_filter(start, end, size):
    return [[0. if i + j > end or i + j <= start else 1. for j in range(size)] for i in range(size)]

# 将值归一化为-1~1
def norm_sigma(x):
    return 2. * torch.sigmoid(x) - 1.

class FAD_Head(nn.Module):
    def __init__(self, size):
        super(FAD_Head, self).__init__()

        # init DCT matrix
        # 生成傅里叶矩阵
        self._DCT_all = nn.Parameter(torch.tensor(DCT_mat(size)).float(), requires_grad=False)
        # 傅里叶矩阵转置
        self._DCT_all_T = nn.Parameter(torch.transpose(torch.tensor(DCT_mat(size)).float(), 0, 1), requires_grad=False)

        # define base filters and learnable
        # 0 - 1/16 || 1/16 - 1/8 || 1/8 - 1 || 0 - 1
        low_filter = Filter(size, 0, size // 16)
        middle_filter = Filter(size, size // 16, size // 8)
        high_filter = Filter(size, size // 8, size)
        all_filter = Filter(size, 0, size)

        self.filters = nn.ModuleList([low_filter, middle_filter, high_filter, all_filter])

    def forward(self, x):
        # DCT  对应论文中公式1
        x_freq = self._DCT_all @ x @ self._DCT_all_T  # [N, 3, 224, 224]
        vutils.save_image(x_freq, "rgb_freq.png")
        # 4 kernel
        y_list = []
        for i in range(4):
            x_pass = self.filters[i](x_freq)  # [N, 3, 224, 224]
            y = self._DCT_all_T @ x_pass @ self._DCT_all  # [N, 3, 224, 224]

            vutils.save_image(y[:,:,:], f"rgb_freq_{i}.png")
            y_list.append(y)
        # 拼接四个可学习的频域图
        out = torch.cat(y_list, dim=1)  # [N, 12, 224, 224]
        return out
if __name__ == '__main__':
    img_path = "2.png"
    rgb = Image.open(img_path).convert("RGB")
    rgb = F.to_tensor(rgb)
    freq = FAD_Head(size=256)
    rgb_freq = freq(rgb)

测试图像:

img


2.png

PS:谁能帮我用代码解决这个问题,赏金就归谁(按时间顺序的第一个人),谢谢大家!

  • 写回答

14条回答 默认 最新

  • 专家-赤兔[在线] 全栈领域优质创作者 2023-11-06 21:11
    关注
    获得0.45元问题酬金

    引自强大而免费的微信小程序:皆我百晓生

    频域图通常是通过对图像进行傅里叶变换来获取的。根据您的描述,您得到的频域图显示了黑底和淡灰色的人脸轮廓,而作者给出的频域图显示了蓝色的明暗人脸形状。

    要将您生成的图像变成作者的样式,您可以尝试以下处理步骤:

    1. 检查颜色映射:可能是由于不同的颜色映射导致了您得到的淡灰色的图像。尝试使用颜色映射函数将图像映射到更接近蓝色的色彩空间。例如,您可以使用OpenCV中的cv2.applyColorMap()函数来应用颜色映射。

    2. 调整亮度和对比度:如果颜色映射没有带来显著改变,您可以尝试调整图像的亮度和对比度。这可以通过线性变换或直方图均衡化来实现。您可以尝试使用OpenCV中的cv2.equalizeHist()函数来进行直方图均衡化。

    3. 调整阈值:如果以上步骤都没有带来满意的结果,您可以尝试将图像转化为二值图像。使用阈值分割方法将图像转换为黑白图像,然后将黑色区域转换为蓝色。

    请注意,这些步骤是一种尝试和调整的过程,具体应用哪些步骤取决于您的具体情况和要求。另外,您可以尝试查看作者提供的代码和相关论文以获取更多关于频域图生成的具体细节。

    评论 编辑记录

报告相同问题?

问题事件

  • 系统已结题 11月14日
  • 修改了问题 11月6日
  • 创建了问题 11月6日

悬赏问题

  • ¥15 kali环境运行volatility分析android内存文件,缺profile
  • ¥15 写uniapp时遇到的问题
  • ¥15 vs 2008 安装遇到问题
  • ¥15 matlab有限元法求解梁带有若干弹簧质量系统的固有频率
  • ¥15 找一个网络防御专家,外包的
  • ¥100 能不能让两张不同的图片md5值一样,(有尝)
  • ¥15 informer代码训练自己的数据集,改参数怎么改
  • ¥15 请看一下,学校实验要求,我需要具体代码
  • ¥50 pc微信3.6.0.18不能登陆 有偿解决问题
  • ¥20 MATLAB绘制两隐函数曲面的交线