ぼかしフィルターなどのフィルターを画像に適用したい[[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]]
。
また、空間領域での畳み込みが周波数領域での乗算と同等であるというアプローチを使用したいと思います。
したがって、私のアルゴリズムは次のようになります。
- 画像を読み込みます。
- フィルタを作成します。
- フィルターと画像の両方を周波数ドメインに変換します。
- 両方を掛けます。
- 出力を Spatial Domain に再変換すると、それが必要な出力になります。
以下は私が使用する基本的なコードです。画像が読み込まれ、cv.cvmat
オブジェクトとして表示されます。
Image
は私の作成のクラスであり、オブジェクトでscipy.matrix
あり、どこでtoFrequencyDomain(size = None)
使用され、使用されるメンバー イメージがあります。spf.fftshift(spf.fft2(self.image, size))
spf
scipy.fftpack
dotMultiply(img)
scipy.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 次元行列のそれぞれで fft2 関数を使用してから、3 次元行列を再作成することでした。
# 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
私が間違っていたこと、またはグレースケールとカラーの両方の写真でそれをどのように達成できますか。