2. ローパスフィルタ
ハイパスフィルタとは真逆に、ローパスフィルタは遮断周波数より低い周波数は減衰させることなく高い周波数のみをカットします。これをかけてみると平滑化されぼんやりした画像を得ることができます。前回説明した平均化フィルタは、フーリエ変換するとローアスフィルタの性質を持つことがわかります。
3. バンドパスフィルタ
画像に含まれる周波数のうち、中間の周波数のみ残すフィルタをバンドパスフィルタと呼びます。実際にこれをかけてみると、ハイパスフィルタをかけたようにエッジが強調され、ローパスフィルタをかけたようにエッジの周りがぼんやりするような画像を得ることができます。
pythonによるフィルタリングの実装
1. ローパスフィルタ
先ほどの画像(img01.png)にローパスフィルタをかけていきます。 もう一度画像を白黒表示させます。
gray = cv2.imread("img01.png",0) plt.imshow(gray) plt.gray()
Show.picture(black&white).py
上絵のように白黒表示ができました。ローパスフィルタをかけれるように、フーリエ変換を行い画像を空間領域から空間周波数領域へとシフトさせます。
img_fft = np.fft.fft2(gray) img_fft2 = np.fft.fftshift(img_fft)
Fourier transform.py
先程と同様、画像をフーリエ変換させました。 次はローパスフィルタを設計していきます。今回は半径10の円の内部のみ1、そのほかは0となるようなフィルタをかけていきます。
size = gray.shape mask = np.zeros(size) length = size[0] centery = size[0]/2 R = 10 for x in range(0,length): for y in range(0,length): if (x- centery)**2 +(y- centery)**2 <R**2: mask[x,y]=1
Design filter.py
それでは、このフィルタを画像にかけていきます。
img_fft2_mask = img_fft2*mask img_fft2_mask= np.fft.fftshift(img_fft2_mask) ifimage = np.fft.ifft2(img_fft2_mask) ifimage = ifimage.real Image.fromarray(np.uint8(ifimage)).show()
Apply filter.py