我想在图片上应用滤镜,例如,模糊滤镜[[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))
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和彩色图片实现这一点。
答案 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