MATLAB イメージローパスフィルター

Ammar Ali 2022年7月12日
MATLAB イメージローパスフィルター

このチュートリアルでは、MATLAB の fspecial() 関数を使用して画像の 2D ローパスフィルターを作成する方法について説明します。

MATLAB でローパスフィルターを使用して画像を滑らかにする

画像には 2つの周波数レベルがあります。画像のエッジとノイズは高周波成分を表し、滑らかな領域は低周波成分を表します。

高周波成分は高強度レベルまたは高コントラストを有し、低周波成分は低強度レベルまたは低コントラストを有する。

画像にシャープなエッジやノイズがあり、それを滑らかにしたいとします。その場合、低周波成分またはピクセルが高周波成分またはピクセルを通過および停止できるようにするローパスフィルターを作成して、画像内のピクセルの強度レベルを下げる必要があります。

画像に滑らかな領域またはコントラストの低い領域があり、それを鮮明にしたいとします。その場合、高周波成分またはピクセルが通過して低周波成分またはピクセルを停止し、画像内のピクセルの強度レベルを上げることができるハイパスフィルターを作成する必要があります。

ローパスフィルターまたはハイパスフィルターを作成するために使用できるフィルターにはさまざまな種類があります。

MATLAB の fspecial() 関数を使用して、2D ローパスまたはハイパスフィルターを作成できます。フィルタを作成した後、imfilter() または filter2() 関数を使用して、指定された画像に適用できます。

fspecial() 関数の構文は、さまざまなフィルターによって異なります。使用可能な fspecial() フィルターとその構文を以下に示します。

Filter_object = fspecial(type)
Filter_object = fspecial('average',hsize)
Filter_object = fspecial('disk',radius)
Filter_object = fspecial('gaussian',hsize,sigma)
Filter_object = fspecial('laplacian',alpha)
Filter_object = fspecial('log',hsize,sigma)
Filter_object = fspecial('motion',len,theta)
Filter_object = fspecial('prewitt')
Filter_object = fspecial('sobel')

最初の構文は fspecial() 関数の基本構文であり、最初の構文の後の 6つのフィルターは画像を滑らかにするために使用されるローパスフィルターであり、最後の 2つのフィルターは与えられた画像。その特定のタイプのフィルターを作成するには、フィルターのタイプまたはフィルター名を渡す必要があります。

一部のフィルターにもオプションの引数がありますが、フィルター名のみを渡す場合、関数はオプションの引数にデフォルト値を使用します。最初の構文の後に示されている特定の構文を使用して、フィルターのオプションの引数を設定することもできます。

たとえば、平均化フィルターの場合、上記の 2 番目の構文を使用して、フィルターサイズを設定できます。これは、正の整数または 2つの要素のベクトルにすることができます。

hsize を正の整数またはスケーラーとして設定すると、フィルターは正方行列になります。hsize を 2つの要素のベクトルとして設定すると、最初の要素は行数を表し、2 番目の要素はフィルター行列の列数を表します。

3 番目の構文は、指定された半径に従って循環平均化フィルターまたはディスクフィルターを作成するために使用されます。これは正の整数であり、デフォルトでは、その値は 5 に設定されます。4 番目の構文は、サイズ hsizesigma は標準偏差を表し、デフォルトではその値は 0.5 に設定されています。

また、MATLAB の imgaussfilt() および imgaussfilt3() 関数を使用して、ガウスフィルターを作成し、特定の画像に適用することもできます。5 番目の構文は、ラプラシアンの形状を設定する alpha に従ってラプラシアンフィルターを作成するために使用され、デフォルト値は 0.2 です。

6 番目の構文は、標準偏差を表すフィルターサイズ hsize および sigma に従って、ガウスファイラーのラプラシアンフィルターを作成するために使用されます。

7 番目の構文は、モーションフィルターを作成して、len で指定されたモーションの長さに応じてカメラの線形モーションを含む画像をスムージングするために使用されます。デフォルト値は 9 で、モーションの角度は度単位です。theta で指定されます。角度は反時計回りの方向になり、デフォルト値は 0 です。

8 番目の構文は、垂直勾配を使用して水平エッジの強度レベルを強化するハイパスフィルターを作成します。垂直エッジを強調するフィルターを作成する場合は、出力フィルター行列の転置を行うことができます。

最後の構文は、最後から 2 番目の構文と同じです。唯一の違いは、最後の構文が平滑化効果を使用してフィルターを作成するために使用されることです。たとえば、fspecial() 関数を使用して平均化フィルターを作成し、画像に存在する塩とコショウのノイズを除去してみましょう。

以下のコードを参照してください。

clc
clear

Input_image = imread('eight.tif');
Noisy_image = imnoise(Input_image,'salt & pepper',0.03);
h = fspecial('average');
Smoothed_image = filter2(h, Input_image);
imshowpair(Noisy_image,Smoothed_image,'montage')

出力:

平均化フィルター

上記のコードでは、imnoise() 関数を使用して特定の画像に塩とコショウのノイズを入れ、filter2() 関数を使用してノイズの多い画像に平均化フィルターを適用しました。imshowpair() 関数を使用して、比較のためにノイズの多い滑らかな画像を表示します。

上記の出力から、平均化フィルターを使用して右側の画像が平滑化されていることがわかります。画像にさまざまなフィルターを適用して、結果を確認できます。

imfilter() 関数を使用して、特定の画像にフィルターを適用することもできます。filter2()imfilter() の違いは、指定された画像にフィルターを適用するためのアルゴリズムです。

imfilter() は倍精度と浮動小数点演算を使用して出力画像のピクセル値を計算し、filter2() は指定された画像とフィルター行列の 2D 畳み込みを取得します。これは 180 度回転します。出力ピクセル値を検索します。これらの両方の関数を試して、結果を比較できます。

入力配列のパディングオプション、出力行列のサイズ、畳み込みオプションなど、imfilter() 関数のいくつかのオプションを設定することもできます。デフォルトで same に設定されている filter2() 関数の場合、出力フィルター処理されたデータの形状を設定することもできますが、完全な 2D フィルター処理されたデータおよび valid の場合は full に設定することもできます。ゼロが埋め込まれたエッジを使用せずに計算されたデータの場合。

filter2() 関数の詳細については、このリンクを確認してください。imfilter() 関数の詳細については、このリンクを確認してください。

著者: Ammar Ali
Ammar Ali avatar Ammar Ali avatar

Hello! I am Ammar Ali, a programmer here to learn from experience, people, and docs, and create interesting and useful programming content. I mostly create content about Python, Matlab, and Microcontrollers like Arduino and PIC.

LinkedIn Facebook

関連記事 - MATLAB Image