使用fft2重塑整形RGB滤镜

时间:2012-10-12 14:50:12

标签: python opencv python-2.7 scipy rgb

我想在图片上应用滤镜,例如,模糊滤镜[[1/9.0, 1/9.0, 1/9.0], [1/9.0, 1/9.0, 1/9.0], [1/9.0, 1/9.0, 1/9.0]]

另外,我想使用空间域中的卷积等效于频域中的乘法的方法。

所以,我的算法就像。

  1. 加载图片。
  2. 创建过滤器。
  3. 转换Filter&图像到频域。
  4. 将两者相乘。
  5. 将输出重新转换为空间域,这应该是所需的输出。
  6. 以下是我使用的基本代码,图像被加载并显示为cv.cvmat对象。

    Image是我创作的一个类,它有一个成员图像,它是scipy.matrix的对象,toFrequencyDomain(size = None)使用spf.fftshift(spf.fft2(self.image, size)) spf是{ {1}}和scipy.fftpack使用dotMultiply(img)

    scipy.multiply(self.image, image)

    所以,如果我告诉OpenCV通过GRAY_SCALE加载图像,那么之前的代码效果很好。

    然而,如果我让图像加载颜色...... f = Image.fromMatrix([[1/9.0, 1/9.0, 1/9.0], [1/9.0, 1/9.0, 1/9.0], [1/9.0, 1/9.0, 1/9.0]]) lena = Image.fromFile("Test/images/lena.jpg") print lena.image.shape lenaf = lena.toFrequencyDomain(lena.image.shape) ff = f.toFrequencyDomain(lena.image.shape) lenafm = lenaf.dotMultiplyImage(ff) lenaff = lenafm.toTimeDomain() lena.display() lenaff.display() 将为lena.image.shape ..

    因此,在使用(512, 512, 3) scipy.fttpack.ftt2时,它会给我一个错误。

    我接下来尝试将我的过滤器转换为3-D ..作为

    "When given, Shape and Axes should be of same length"

    并且,不知道axis参数的作用,我用随机数添加[[[1/9.0, 1/9.0, 1/9.0], [1/9.0, 1/9.0, 1/9.0], [1/9.0, 1/9.0, 1/9.0]], [[1/9.0, 1/9.0, 1/9.0], [1/9.0, 1/9.0, 1/9.0], [1/9.0, 1/9.0, 1/9.0]], [[1/9.0, 1/9.0, 1/9.0], [1/9.0, 1/9.0, 1/9.0], [1/9.0, 1/9.0, 1/9.0]]] ,直到它为dotMultiply提供了正确的滤波器输出形状。

    但是,当然这不是正确的价值。事情变得更糟。

    我的最终试验是在每个组件2-D矩阵上使用fft2函数,然后使用以下代码重新制作3-D矩阵。

    (-2, -1, -1), (-1, -1, -2), .. etc.

    对我犯错的任何帮助,或者如何为GreyScale和彩色图片实现这一点。

2 个答案:

答案 0 :(得分:2)

最简单的解决方案是将图像分割成单独的r / g / b图像并单独过滤。

答案 1 :(得分:1)

您将在3D矩阵分成三个2D矩阵的末端朝向正确的方向前进。这是我将如何做到的 - 显然这是未经测试的(我没有你的Image课程等),但它应该给你一个良好的开端:

for i, channel in enumerate(self.image):
    channel_ = spf.fftshift(spf.fft2(channel)) # take FFT of each channel (r,g,b) separately
    channel_ = scipy.multiply(channel_,ff) # multiply each channel by the filter (freq. domain)
    filtered_image[:][:][i] = spf.fftshift(spf.ifft2(channel_)) # inverse FFT each channel separately