基于频域方法的超分辨率算法实现难题及参数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
相关产品推荐
相关产品推荐

