You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于频域方法的超分辨率算法实现难题及参数L、T的选择疑问

基于频域方法的超分辨率算法实现难题及参数L、T的选择疑问

我现在正在尝试实现一篇图像超分辨率的频域算法,目前卡在了最后一步:已经算出了连续图像傅里叶变换的F^c值(对应公式10b),但不知道该怎么把这些值正确放入矩阵,才能通过逆FFT得到高分辨率(HR)图像。另外,我也搞不懂该如何合理选择参数L和T(为了简化我设了L_x=L_y,T_x=T_y)。下面是我的代码,还有具体的疑问:

一、FFT逆变换的矩阵填充问题

我已经通过最小二乘法算出了每个位置的F^c值,但在填充HR_fourier矩阵时可能存在索引错误,导致后续逆FFT无法得到正确的HR图像。我的代码里这部分的处理是:

for m in range(N):
    for n in range(N):
        X, residus, rang, singular_values = calcule_solution(m,n)
        for r in range(1, 4*L*L +1):
            HR_fourier[centre_HR + m + N*(coef_i(r))][centre_HR + n + N*(coef_l(r))] = X[r-1]

之后尝试用np.fft.ifft2(HR_fourier)得到的结果不对,想知道这里的索引映射是不是哪里出错了?

二、参数L和T的实际选择问题

  • 参数L:文章里公式(6)定义L是基于连续傅里叶变换F_c的带限假设,即当|x|>LT、|y|>LT时F_c(x,y)=0,但实际中该怎么确定这个L值呢?
  • 参数T:T是采样周期,它和我想要的 upscale 倍率有关吗?实际应用中该怎么设置?

附上我的完整代码:

import numpy as np
import cv2
import matplotlib.pyplot as plt
import math

#Définition des constantes
N = 128 #Résolution de 128 pixels pour les g_k
p = 4 #Nombre d'images floues à disposition
shifts = [(0,0), (0,30), (30,0), (30,30)] #Shifts entre les images
x = [0, 0, 30, 30]
y = [0, 30, 0, 30]
T = 1 #Période d'échnatillonnage (égale selon x et y)
L = 1 #L défini tel que F(x,y) = 0 lorsque |x| > LT et |y| > LT
centre_HR = L*N #centre de l'image HR_fourier

def load_images():
    #charges les images dans le dossier, en appliquant les shifts voulus
    images = []
    for t in shifts:
        x,y = t
        img = cv2.imread('jojo.jpg', cv2.IMREAD_GRAYSCALE)
        images.append(cv2.resize(img[x:(x+226), y:(y+226)], (128,128)))
    for k in range(len(images)):
        cv2.imwrite('g_%d.jpg' % k, images[k])
    return images

def coef_i(r):
    return ((r-1) % (2*L) ) - L

def coef_l(r):
    return math.floor((r-1)/(2*L)) - L

def calcule_Phi(m,n):
    #Calcule la matrice Phi
    tab = [ [(1/(T*T)) * np.exp(1j*2*np.pi*(x[k]*( (m + N*coef_i(r))/(N*T) ) + y[k]*( (n+N*coef_l(r))/(N*T) ))) for r in range (1, 4*L*L +1)] for k in range(p)]
    return np.matrix(tab)

def calcule_colonne_G(m,n):
    #Calcule la colonne associée à G
    tab = [[G[k][m][n]] for k in range(p)]
    return np.matrix(tab)

def calcule_solution(m,n):
    #Résout le problème matriciel avec un algo least squares
    return np.linalg.lstsq(calcule_Phi(m,n), calcule_colonne_G(m,n), rcond=None)

def initialise_sol():
    sol = [[0 + 0j for i in range(2*L*N)] for j in range(2*L*N)]
    return np.array(sol)

if __name__ == "__main__":
    noir_et_blanc = cv2.imread('jojo.jpg', cv2.IMREAD_GRAYSCALE)
    cv2.imwrite('noir_et_blanc.jpg', noir_et_blanc)
    HR_fourier = initialise_sol()
    #The continuous Fourier image
    g = load_images()
    G = [np.fft.fft2(im) for im in g]
    for m in range(N):
        for n in range(N):
            X, residus, rang, singular_values = calcule_solution(m,n)
            for r in range(1, 4*L*L +1):
                HR_fourier[centre_HR + m + N*(coef_i(r))][centre_HR + n + N*(coef_l(r))] = X[r-1]
    #To do : the F_c values are calculated : do the inverse fft to get the HR image
    #res = np.fft.ifft2(HR_fourier)
    #res = np.abs(res)
    #cv2.imwrite('HR.jpg', res)

我是这个领域的新手,可能代码里有不少错误,非常感谢大家的帮助!

内容来源于stack exchange

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.08 11:13:02