2019年7月3日 更新

ディジタル画像処理~pythonによる空間フィルタリングpart2~ 

今回はフーリエ変換を用いた周波数領域でのフィルタリングをpythonで行ってみました。

50,674 view お気に入り 2

2. ローパスフィルタ

ハイパスフィルタとは真逆に、ローパスフィルタは遮断周波数より低い周波数は減衰させることなく高い周波数のみをカットします。これをかけてみると平滑化されぼんやりした画像を得ることができます。前回説明した平均化フィルタは、フーリエ変換するとローアスフィルタの性質を持つことがわかります。

3. バンドパスフィルタ

画像に含まれる周波数のうち、中間の周波数のみ残すフィルタをバンドパスフィルタと呼びます。実際にこれをかけてみると、ハイパスフィルタをかけたようにエッジが強調され、ローパスフィルタをかけたようにエッジの周りがぼんやりするような画像を得ることができます。

pythonによるフィルタリングの実装

1. ローパスフィルタ

先ほどの画像(img01.png)にローパスフィルタをかけていきます。 もう一度画像を白黒表示させます。

gray = cv2.imread("img01.png",0)  
plt.imshow(gray)              
plt.gray()
Show.picture(black&white).py
img01.png(白黒表示)

img01.png(白黒表示)

上絵のように白黒表示ができました。ローパスフィルタをかけれるように、フーリエ変換を行い画像を空間領域から空間周波数領域へとシフトさせます。

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
43 件

関連する記事 こんな記事も人気です♪

この記事のキュレーター

亀谷 桃子 亀谷 桃子