R - 图像的FFT傅里叶谱

3

我正在使用R Studio进行图像处理任务。当前我正在使用'EBImage, fftw, ...'库。我有一个问题关于傅里叶分析和功率谱。

1)我有一个二维矩阵,也就是一张图片。这张图片由黑白水平线构成。我想进行傅里叶变换并通过绘图显示其大小。由于图像中的黑色线条是水平的,因此功率谱将会有一条垂直的线。但我没能找到实现的方法。

现在我正在使用这张图片进行测试: 正方形

如果正确处理,这张图片在水平和垂直轴上应该具有一些周期性频率。然后FFT Spectrum应该看起来像一个“+”。但我发现结果完全不同。

以下是我的代码:

setwd(".../Project/R/Workspace/Task1")
library("EBImage"  , lib.loc="~/R/win-library/3.2")
library("fftwtools", lib.loc="~/R/win-library/3.2")
library("fftw", lib.loc="~/R/win-library/3.2")

# Image Acquisition
img <- readImage(".../Project/Beispielbilder/drmcircle.jpg")
display(img, title='Image')

# Grayscaled
img_gray<-channel(img,"gray")

# FFT
img_ff <- fft(img_gray)    #fftw2d

magntd <- sqrt(Re(img_ff)^2+Im(img_ff)^2)
phase  <- atan(Im(img_ff)/Re(img_ff))

plot(log(magntd),main="FFT")

因此,这就是我得到的内容: FFT频谱

以下是我的问题:
1)如何获得正确的频谱图像? 2)如何将其作为图像而不是绘图查看?(请参见顶部的示例链接。)
提前感谢您的帮助。

你能否提供一个小的可重现的例子(例如,一个包含你代码的2D矩阵示例)?https://dev59.com/eG025IYBdhLWcg3whGSx - Eugen
你好@Eugen,我已经更正了我的问题以便更清晰地定义。这是我想要达到的示例链接:[http://matlabgeeks.com/tips-tutorials/how-to-do-a-2-d-fourier-transform-in-matlab/]。 - EMI
我解决了我的问题,这里我提供代码。 - EMI
1个回答

4
我已经解决了它。在这里我添加了代码。请注意,fftshift函数来自:[如何在R中编写fftshift和ifftshift?]。
setwd(".../Project/R/Workspace/Task1")
library("EBImage"  , lib.loc="~/R/win-library/3.2")

# Image
img <- readImage(".../Project/Beispielbilder/drmtri.jpg")
display(img, title='Image')

# Grayscaled
img_gray<-channel(img,"gray")

# FFT
img_ff <- fft(img_gray) #fftw2d


###################################################
###################################################
# FFT SHIFT
fftshift <- function(img_ff, dim = -1) {

  rows <- dim(img_ff)[1]    
  cols <- dim(img_ff)[2]    

  swap_up_down <- function(img_ff) {
    rows_half <- ceiling(rows/2)
    return(rbind(img_ff[((rows_half+1):rows), (1:cols)], img_ff[(1:rows_half), (1:cols)]))
  }

  swap_left_right <- function(img_ff) {
    cols_half <- ceiling(cols/2)
    return(cbind(img_ff[1:rows, ((cols_half+1):cols)], img_ff[1:rows, 1:cols_half]))
  }

  if (dim == -1) {
    img_ff <- swap_up_down(img_ff)
    return(swap_left_right(img_ff))
  }
  else if (dim == 1) {
    return(swap_up_down(img_ff))
  }
  else if (dim == 2) {
    return(swap_left_right(img_ff))
  }
  else {
    stop("Invalid dimension parameter")
  }
}

ifftshift <- function(img_ff, dim = -1) {

  rows <- dim(img_ff)[1]    
  cols <- dim(img_ff)[2]    

  swap_up_down <- function(img_ff) {
    rows_half <- floor(rows/2)
    return(rbind(img_ff[((rows_half+1):rows), (1:cols)], img_ff[(1:rows_half), (1:cols)]))
  }

  swap_left_right <- function(img_ff) {
    cols_half <- floor(cols/2)
    return(cbind(img_ff[1:rows, ((cols_half+1):cols)], img_ff[1:rows, 1:cols_half]))
  }

  if (dim == -1) {
    img_ff <- swap_left_right(img_ff)
    return(swap_up_down(img_ff))
  }
  else if (dim == 1) {
    return(swap_up_down(img_ff))
  }
  else if (dim == 2) {
    return(swap_left_right(img_ff))
  }
  else {
    stop("Invalid dimension parameter")
  }
}
###################################################
###################################################
# FFT SHIFT


# Magnitude and Phase
magntd <- sqrt(Re(img_ff)^2+Im(img_ff)^2)
phase  <- atan(Im(img_ff)/Re(img_ff))

img_fftsh <- fftshift(magntd)

display(log(img_fftsh),title="FFT")

感谢您提供如此有用的答案。 - SeldomSeenSlim

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接