我想在图像上应用滤镜,例如模糊滤镜[[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]]
。
另外,我想使用空间域中的卷积相当于频域中的乘法的方法。
所以,我的算法会是这样的。
- 加载图像。
- 创建过滤器。
- 将过滤器和图像都转换为频域。
- 两者相乘。
- 将输出重新转换为空间域,这应该是所需的输出。
以下是我使用的基本代码,图像被加载并显示为cv.cvmat
对象。
Image
是我创建的一个类,它有一个成员图像,它是一个对象scipy.matrix
并toFrequencyDomain(size = None)
使用spf.fftshift(spf.fft2(self.image, size))
where spf
isscipy.fftpack
和dotMultiply(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
关于我做错了什么的任何帮助,或者我如何才能为灰度和彩色图片实现这一点。