1

我想在图像上应用滤镜,例如模糊滤镜[[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. 将过滤器和图像都转换为频域。
  4. 两者相乘。
  5. 将输出重新转换为空间域,这应该是所需的输出。

以下是我使用的基本代码,图像被加载并显示为cv.cvmat对象。

Image是我创建的一个类,它有一个成员图像,它是一个对象scipy.matrixtoFrequencyDomain(size = None)使用spf.fftshift(spf.fft2(self.image, size))where spfisscipy.fftpackdotMultiply(img)usesscipy.multiply(self.image, image)

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()

所以,如果我告诉 OpenCV 通过 GRAY_SCALE 加载图像,前面的代码工作得很好。

但是,如果我让图像以颜色加载...... lena.image.shape将是(512, 512, 3)..

scipy.fttpack.ftt2所以,它在使用 say 时给了我一个错误"When given, Shape and Axes should be of same length"

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

[[[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]]]

而且,不知道轴参数的作用,我用随机数添加它,(-2, -1, -1), (-1, -1, -2), .. etc.直到它为我提供正确的过滤器输出形状以使 dotMultiply 工作。

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

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

# Spiltting the 3-D matrix to three 2-D matrices.
for i, row in enumerate(self.image):
            r.append(list())
            g.append(list())
            b.append(list())
            for pixel in row:
                r[i].append(pixel[0])
                g[i].append(pixel[1])
                b[i].append(pixel[2])
        rfft = spf.fftshift(spf.fft2(r, size)) 
        gfft = spf.fftshift(spf.fft2(g, size)) 
        bfft = spf.fftshift(spf.fft2(b, size))
        newImage.image = sp.asarray([[[rfft[i][j], gfft[i][j], bfft[i][j]] for j in xrange(len(rfft[i]))] for i in xrange(len(rfft))] )
        return newImage

关于我做错了什么的任何帮助,或者我如何才能为灰度和彩色图片实现这一点。

4

2 回答 2

2

最简单的解决方案是将图像拆分为单独的 r/g/b 图像并独立过滤每个图像。

于 2012-10-12T15:39:17.903 回答
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
于 2012-10-12T15:53:45.280 回答