mat data type = 15 is not supported
error
といったエラーがきます。これは逆変換したときに複素数が残ってしまっているからです。なので逆変換された後の配列の実数部分だけを取り出し、配列から出力を行います。
ifimage = np.fft.ifft2(fimage) ifimage = ifimage.real Image.fromarray(np.uint8(ifimage)).show()
Array to Image.py
※Image.fromarray(np.uint8())としなければいけない理由は、ピクセル値に基準をつけないといけないからです。例えば「30」というピクセル値があったとき、それがどのくらいの明るさなのかは白と黒をどのように設定しているかによります。ピクセル値をいろいろいじったあと、出力する画素値は「0が白、黒が255」であると指定して初めて画像が出力されます。
フィルタ設計
これからフィルタを設計していきます。上のようにnp.fft.fft2のフーリエ変換を行うと周波数原点が、画像の左上にきます。
なので、ImageJと同じ処理をするためには画像をshiftしておく必要があります。フーリエ変換の中心位置を合わせるのは以下のようにすればOKです。
fimage = np.fft.fftshift(fimage)
Shift.py
フィルターを設計していきます。前回の記事で書いたように、フィルタは周波数領域では要素の掛け算で表されました。この画像と同じサイズの行列を作ります。
size = image.shape filter_matrix = np.zeros(size)
size.py
ローパスフィルタを作ってみましょう。周波数領域で中心部分だけ通し、他が0になるように行列を設計すればOKです。
length = size[0] center = size[0]/2 R = 50 for i in range(0,length): for j in range(0,length): if (i-center)*(i-center) + (j-center)*(j-center) < R*R filter_matrix[i][j] = 1
filter.py
フィルターとなる行列が作られました。画像をフーリエ変換したものにこれをかければローパスフィルタの完成です。
出力させてみましょう。
出力させてみましょう。
fimage = fimage*filter_matrix fimage = np.fft.fftshift(fimage) #shiftする fimage = fimage*filter_matrix fimage = np.fft.fftshift(fimage) #shiftしたものをもとに戻す ifimage = np.fft.ifft2(fimage) #Inverse Fourier Transform ifimage = ifimage.real Image.fromarray(np.uint8(ifimage)).show()
Show.py