2016-11-07 25 views
1

私はグレースケール画像を持っています。私はMatlabで畳み込み関数を使う

del = sum(absoluteValue(anypixelInensity - it's 8 neighbors Pixel Intensity) 

I = imread('crop.bmp'); 


%KERNEL 
windowSize = 3; 
kernel = -1 * ones(3,3); 
del = abs(conv2(double(I), double(kernel), 'same')); 
disp(I) 
disp(del) 

が、私はMathWorks社のMATLAB conv2機能とそれを実装したい画像の各ピクセルのためのデルを計算します。これは、その近傍から現在のピクセル強度を減算し、絶対和を与える。例えば

10 2 3 
12 15 7 
4 5 6 

del(1,1) = abs(10-2)+abs(10-12)+abs(10-15) 
or del(2,2) = abs(15-10)+abs(15-2)+abs(15-3)+abs(15-12)+abs(15-7)+abs(15-4)+abs(15-5)+abs(15-6) 
+0

'abs 'を' conv2'のフィルタに組み込むことはできません。いくつか調べて、これを実装する特別なフィルタがあるかどうかを調べます。 – beaker

+0

これは[nlfilter](https://www.mathworks.com/help/images/performing-sliding-neighborhood-operations.html)とカスタム関数を必要とすると思います。私はそれを試してみましょう。 – beaker

答えて

1

@AnderBiguriのように、カーネル内のabsが非線形になるため、これは少し難解です。したがって、conv2は動作しません。

ただし、nlfilterにカスタム機能を使用することはできます。 (この実装ではStatistics Toolboxにあるnansumが使用されていますが、この機能にアクセスできない場合は、nansumを使用するほうが簡単です)

もう一つの難点は、画像の枠線を処理して、それらが合計を狂わせないようにします。これは、自分自身でパディングするイメージを処理していることを意味します。私はパッドに値nanを使用することを選択しました。私はまた、怠け者であり、windowSizeの奇妙な値をとっています。これが必ずしも当てはまらない場合は、パディングを調整する必要があります。

% windowSize assumed to be odd; window assumed to be square 
windowSize = 3; 

% pad the input image 
% padsize is how far the window extends beyond anchor 
padsize = floor(windowSize/2); 
A = padarray(I, [padsize, padsize], nan); 

% create an anonymous function for nlfilter to use 
% calculate row/column number of anchor within its neighborhood 
anchor = ceil(windowSize/2); 
% subtract the anchor element from its neighbors 
% then sum the neighbors *not* equal to NaN 
% (value at anchor position will be 0) 
f = @(x) sum(nansum(abs(x-x(anchor,anchor)))); 

% filter padded image, and then crop off the padding 
del = nlfilter(A, [windowSize, windowSize], f); 
del = del(1+padsize:end-padsize, 1+padsize:end-padsize); 
+0

素晴らしい!しかし、大きな画像の場合はビーカーに処理するのに時間がかかります。より速くすることは可能ですか? –

+0

それは長い時間がかかるようです。私はそれを見てみましょう。 – beaker

+0

これをスピードアップする明確な方法はありません。二重forループは実際には少し高速ですが、それほど重要ではありません。 – beaker

0

はい、conv2関数畳み込み自体を行います。

画像、Aを考えると、カーネルk

imout=conv2(A,k); 

はあなたに画像の上のカーネルのコンボリューションを与えるだろう。

Read the documentation

しかし、あなたはそれが画像のよりよい異なる種類をupports Sと、imfilterを使用することもできます。

+0

質問を編集しました。あなたの意見を述べてください。 –

+0

@Nektar 'conv2'を使うとループは必要なく、' conv2'はその仕事をします。あなたがループでそれをやりたいのであれば、あなた自身で書く必要があります。もちろん、自分で書く必要がある場合は、これが宿題であることを意味するので、私たちはあなたのためにはしません。 –

+0

私はすでにループでそれを行っています(編集された質問を参照)。しかし、より高速な実行のためにconv2を実装したいと思います。私が固執しているのは、カーネルを定義することです。私は小さな4 * 4行列を試しましたが、conv2を使用するとカーネルをどのように定義すればよいのか分かりません。 –

関連する問題