入力画像にガボールフィルターを適用する


11

特定のスケールでGaborフィルターを適用しようとしました(ラムダとシグマの私の値によると、それは(7x7)であり、4つの方向(0、、および)を入力グレースケールイメージに変換します。π4π2π4

私のコードでは、3つのステップが実行されます。

  1. ガボールフィルターの作成

  2. RGB画像を読み取り、それをグレースケールに変換し、最終的に2倍に変換します。

  3. 作成したガボールを入力画像に適用します(ここでは、私のコードが真であるかどうかはわかりません。そのため、あなたの意見が必要です

1)--------------ガボールフィルターを作成します(サイズ= 7x7および4方向)

%define the five parameters
theta=....; %either 0 or pi/4 or pi/2 or 3pi/4
lambda=3.5;
gamma=0.3;
sigma=2.8;
psi=0;

sigma_x = sigma;
sigma_y = sigma/gamma;

nstds = 5;
xmax = max(abs(nstds*sigma_x*cos(theta)),abs(nstds*sigma_y*sin(theta)));
xmax = ceil(max(1,xmax));
ymax = max(abs(nstds*sigma_x*sin(theta)),abs(nstds*sigma_y*cos(theta)));
ymax = ceil(max(1,ymax));
xmin = -xmax; ymin = -ymax;
[x,y] = meshgrid(xmin:xmax,ymin:ymax);

x_theta=x*cos(theta)+y*sin(theta);
y_theta=-x*sin(theta)+y*cos(theta);

gb= exp(-.5*(x_theta.^2/sigma_x^2+y_theta.^2/sigma_y^2)).*cos(2*pi/lambda*x_theta+psi);

figure(2);
imshow(gb);
title('theta=...');
%imagesc(gb);
%colormap(gray);
%title('theta=...');

ここに画像の説明を入力してください

2)------------入力画像を読み取ります

I=imread('piano.jpg');
image_resize=imresize(I, [160,160]);
image_gray=rgb2gray(image_resize);
image_double=im2double(image_gray);
figure(1);
imshow(image_double);

ここに画像の説明を入力してください

3)-----作成された上記のガボールを入力画像に適用します(このステップのコードが100%真であるかどうかはわかりません。そのため、正しい答えが得られた場合は、あなたの意見と助けが必要です。 )

figure(3);
filtered = conv2(image_double,gb);
imagesc(filtered);
colormap(gray);
title('theta=....');

ここに画像の説明を入力してください


また、conv2を使用している場合は、「同じ」オプションを付けて使用してください。
Tolga Birdal 2014年

エラー:ファイル:practise1.m行:3列:7等号の左側の式は、割り当ての有効なターゲットではありません。このコードを実行すると、このエラーが見つかりました
Engr Rao Zaka

このフィルターは7x7ではありませんか?
jiggunjer 2017

回答:


1

コードは正しく、結果は一貫しています。いくつかの「隠された機能」のために、それらに驚かれるかもしれません。

最初に、 conv2デフォルトで完全なたたみ込みを返します。結果は、画像のサイズにカーネルのサイズの半分の境界を加えたものになります(つまり、画像のサイズにカーネルのサイズを加えた場合の合計サイズ)。結果を解釈するときは、注意してください。

第二に、結果は、カーネルとローカルイメージパッチ間の相関が高いほど強い係数を表します。予想どおり、イメージの境界も抽出します。特に、左端の結果が強い縦線を示していることを確認してください。

最後に、imagescデフォルトでは、係数の最大値から最小値までの間でスケーリングします。そのため、左端の結果では、主に境界線が表示されます。

さまざまなオプションがありますconv2説明ではhelp conv2、この動作を制御することができたが。

log-Gaborsなど、エッジを検出するためのカーネルにはさまざまな定義があることにも注意してください。

さまざまな種類のフィルター

(Pythonでの)完全な実装に興味がある場合は、https: //pythonhosted.org/LogGabor/(恥知らずな自己プラグイン😇)を参照してください。


0

あなたのコードは正しいです。非常にうまく行っているフィルターカーネルで2次元畳み込みを行うだけです。

幸運を


理解できません。(conv2関数を使用しているように)2次元畳み込みを実行しています。もう1つの方法は、周波数領域で乗算を行うことです(時間領域または空間領域でのたたみ込みは、周波数領域での乗算と同等であるため)。ただし、conv2は基本的に同じことを(内部で!!!)実行するため、これを行う必要はありません
Ujjwal Aryan

まさに:) ,, HMAXモデルを知っていますか?(S1、C1、S2、C2レイヤー...)。私は今C1レイヤー(S1ユニット間の最大演算)を計算しようとしています、それについていくつかのアイデアを知っていますか(MATLABコード)?
リスト
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.