【发布时间】:2016-11-23 09:37:19
【问题描述】:
我在 Python 中实现 FFT 时遇到问题。我有完全奇怪的结果。 好的,我想打开图像,获取RGB中每个像素的值,然后我需要对其使用fft,然后再次转换为图像。
我的步骤:
1) 我正在用 Python 中的 PIL 库像这样打开图像
from PIL import Image
im = Image.open("test.png")
2) 我得到了像素
pixels = list(im.getdata())
3) 我将每个像素分成 r,g,b 值
for x in range(width):
for y in range(height):
r,g,b = pixels[x*width+y]
red[x][y] = r
green[x][y] = g
blue[x][y] = b
4)。假设我有一个像素 (111,111,111)。并在像这样的所有红色值上使用 fft
red = np.fft.fft(red)
然后:
print (red[0][0], green[0][0], blue[0][0])
我的输出是:
(53866+0j) 111 111
我认为这是完全错误的。我的图像是 64x64,来自 gimp 的 FFT 完全不同。实际上,我的 FFT 只给了我具有巨大值的数组,这就是为什么我的输出图像是黑色的。
你知道问题出在哪里吗?
[编辑]
我已按照建议更改为
red= np.fft.fft2(red)
然后我缩放它
scale = 1/(width*height)
red= abs(red* scale)
而且,我得到的只是黑色图像。
[编辑2]
假设我不想打开它并保存为灰度图像。所以我就是这样做的。
def getGray(pixel):
r,g,b = pixel
return (r+g+b)/3
im = Image.open("test.png")
im.load()
pixels = list(im.getdata())
width, height = im.size
for x in range(width):
for y in range(height):
greyscale[x][y] = getGray(pixels[x*width+y])
data = []
for x in range(width):
for y in range(height):
pix = greyscale[x][y]
data.append(pix)
img = Image.new("L", (width,height), "white")
img.putdata(data)
img.save('out.png')
在这之后,我得到了这张图片,没关系。所以现在,我想在我的图像上做fft,然后我会把它保存到新的,所以我这样做
scale = 1/(width*height)
greyscale = np.fft.fft2(greyscale)
greyscale = abs(greyscale * scale)
加载后。将其保存到文件后,我有。现在让我们尝试使用 gimp 打开 test.png 并使用 FFT 过滤器插件。我得到这张图片,这是正确的
我该如何处理?
【问题讨论】:
-
如果你有图片,我建议你使用
fft2进行二维离散傅里叶变换docs.scipy.org/doc/numpy/reference/generated/… -
我认为这个问题有一个很大的XY problem。请告诉我们您真正想要做什么。是否有您想要实现的特定算法?另外,您能否向我们展示一个示例图像以及 Gimp 的 FFT 生成的内容(您想在 Python 中尝试和生成的内容)?
-
能否请您分享将生成的 FFT 保存为图像的代码?