2016-05-23 11 views
0

私はMatlabでファジーインパルスノイズの検出方法を実装しようとしています。グレースケール画像の各非境界画素について、中心画素の8つの可能なすべての近隣の異なる勾配を計算し、ファジー規則をチェックし、その画素が騒々しいかどうかを検出する3 * 3ウィンドウを定義する。しかし、それはちょうど最初のピクセルを通過し、正しく計算します。 2番目のピクセルのために私は次のエラーを取得します。誰でも助けてくれますか? さらに、グラデーションを計算するための関数を定義しようとしていますが、これはすべての方向に対してそのような関数を定義できるのですか? エラー:Matlabのファジーインパルスノイズ検出

インデックスが行列の寸法を超えています。

メイン(29行目)のエラー g2 = double(img_temp(r、c + 1) - img_temp(r、c));ここ

は私のコードです:

close all 
clc 

[file, path] = uigetfile('*.*' , 'Open an image'); 
filename = strcat(path, file); 
img = (imread(filename)); 

dim = ndims(img); 

if (dim==3) 
    img = rgb2gray(img); 

end 

figure, imshow(img); 

k = 1; 
[row , col] = size(img); 
for r=2:row-1 
    largeCount = 0; 

    for c=2:col-1 
     img_temp = img(r-1:r+1, c-1:c+1); 

    %% Gradient Calculation in Direction : N 
     g0 = double(img_temp(r-1,c) - img_temp(r,c)); 
     g1 = double(img_temp(r, c-1) - img_temp(r,c)); 
     g2 = double(img_temp(r, c+1) - img_temp(r,c)); 

     g_weight = max (max (evalfis([g0 g1 0],out) , evalfis([g0 0 g2],out)), evalfis([g0 g1 g2],out)); 
    if g_weight >128 
     largeCount = largeCount+1; 
    end 

    %% Gradient Calculation in Direction : NE 
    g0 = double(img_temp(r-1 , c+1) - img_temp(r,c)); 
    g1 = double(img_temp(r-1, c-1) - img_temp(r,c)); 
    g2 = double(img_temp(r+1 , c+1) - img_temp(r,c)); 

    g_weight = max (max (evalfis([g0 g1 0],out) , evalfis([g0 0 g2],out)), evalfis([g0 g1 g2],out)); 
    if g_weight >128 
     largeCount = largeCount+1; 
    end 

    %% Gradient Calculation in Direction : E 
    g0 = double(img_temp(r,c+1) - img_temp(r,c)); 
    g1 = double(img_temp(r-1,c) - img_temp(r,c)); 
    g2 = double(img_temp(r+1 ,c) - img_temp(r,c)); 


    g_weight = max (max (evalfis([g0 g1 0],out) , evalfis([g0 0 g2],out)), evalfis([g0 g1 g2],out)); 
    if g_weight >128 
     largeCount = largeCount+1; 
    end 

    %% Gradient Calculation in Direction : SE 
    g0 = double(img_temp(r+1, c+1) - img_temp(r,c)); 
    g1 = double(img_temp(r-1 , c+1) - img_temp(r,c)); 
    g2 = double(img_temp(r+1 , c-1) - img_temp(r,c)); 

    g_weight = max (max (evalfis([g0 g1 0],out) , evalfis([g0 0 g2],out)), evalfis([g0 g1 g2],out)); 
    if g_weight >128 
     largeCount = largeCount+1; 
    end 

    %% Gradient Calculation in Direction : S 
    g0 = double(img_temp(r+1, c) - img_temp(r,c)); 
    g1 = double (img_temp(r , c+1) - img_temp(r,c)); 
    g2 = double(img_temp(r , c-1) - img_temp(r,c)); 

    g_weight = max (max (evalfis([g0 g1 0],out) , evalfis([g0 0 g2],out)), evalfis([g0 g1 g2],out)); 
    if g_weight >128 
     largeCount = largeCount+1; 
    end 

    %% Gradient Calculation in Direction : SW 
    g0 = double(img_temp(r+1, c-1) - img_temp(r,c)); 
    g1 = double(img_temp(r+1 , c+1) - img_temp(r,c)); 
    g2 = double(img_temp(r-1, c-1) - img_temp(r,c)); 


    g_weight = max (max (evalfis([g0 g1 0],out) , evalfis([g0 0 g2],out)), evalfis([g0 g1 g2],out)); 
    if g_weight >128 
     largeCount = largeCount+1; 
    end 

    %% Gradient Calculation in Direction : W 
    g0 = double(img_temp(r,c-1) - img_temp(r,c)); 
    g1 = double(img_temp(r+1, c) - img_temp(r,c)); 
    g2 = double(img_temp(r-1, c) - img_temp(r,c)); 


    g_weight = max (max (evalfis([g0 g1 0],out) , evalfis([g0 0 g2],out)), evalfis([g0 g1 g2],out)); 
    if g_weight >128 
     largeCount = largeCount+1; 
    end 

    %% Gradient Calculation in Direction : NW 
    g0 = double(img_temp(r-1,c-1) - img_temp(r,c)); 
    g1 = double(img_temp(r+1 , c-1) - img_temp(r,c)); 
    g2 = double(img_temp(r-1 , c+1) - img_temp(r,c)); 


    g_weight = max (max (evalfis([g0 g1 0],out) , evalfis([g0 0 g2],out)), evalfis([g0 g1 g2],out)); 
    if g_weight >128 
     largeCount = largeCount+1; 
    end 
    k = k+1; 
    end 

    %% if largeCount > 4 then the pixel is noisy for sure 
    if largeCount> 4 
     %% Add the pixel value to histogram 
     out(r,c)= 0; 
    else 
     %% Don't change pixel value 

     output(r,c) = (temp(r,c)); 
    end 

end 

figure ; imshow(output); 

編集:私は、しかし、私のコードを変更した

私は、次のコードを実行していながら、それが一時停止します(関数呼び出しスタック:ismemeber)とドン私にimg_outを表示しないでください。このエラーが発生します。

69 [sortuAuB、IndSortuAuB] = sort([uA; uB]);

close all 
clc 

[file, path] = uigetfile('*.*' , 'Open an image'); 
filename = strcat(path, file); 
img = (imread(filename)); 

dim = ndims(img); 

if (dim==3) 
    img = rgb2gray(img); 

end 

figure, imshow(img); 

k = 1; 
out = readfis('NoiseDetection.fis'); 

[row , col] = size(img); 

img_out = zeros(row , col , 'uint8'); 

for r=2:row-1 
    largeCount = 0; 

    for c=2:col-1 
     img_temp = img(r-1:r+1, c-1:c+1); 

    %% Gradient Calculation in Direction : N 
     g0 = double(img_temp(1,2) - img_temp(2,2)); 
     g1 = double(img_temp(2,1) - img_temp(2,2)); 
     g2 = double(img_temp(2,3) - img_temp(2,2)); 

    g_weight = max (max (evalfis([g0 g1 0],out) , evalfis([g0 0 g2],out)), evalfis([g0 g1 g2],out)); 
    if g_weight >128 
     largeCount = largeCount+1; 
    end 

    %% Gradient Calculation in Direction : NE 
    g0 = double(img_temp(1,3) - img_temp(2,2)); 
    g1 = double(img_temp(1,1) - img_temp(2,2)); 
    g2 = double(img_temp(3,3) - img_temp(2,2)); 

    g_weight = max (max (evalfis([g0 g1 0],out) , evalfis([g0 0 g2],out)), evalfis([g0 g1 g2],out)); 
    if g_weight >128 
     largeCount = largeCount+1; 
    end 

    %% Gradient Calculation in Direction : E 
    g0 = double(img_temp(2,3) - img_temp(2,2)); 
    g1 = double(img_temp(1,2) - img_temp(2,2)); 
    g2 = double(img_temp(3,2) - img_temp(2,2)); 

    g_weight = max (max (evalfis([g0 g1 0],out) , evalfis([g0 0 g2],out)), evalfis([g0 g1 g2],out)); 
    if g_weight >128 
     largeCount = largeCount+1; 
    end 

    %% Gradient Calculation in Direction : SE 
    g0 = double(img_temp(3,3) - img_temp(2,2)); 
    g1 = double(img_temp(1,3) - img_temp(2,2)); 
    g2 = double(img_temp(3,1) - img_temp(2,2)); 


    g_weight = max (max (evalfis([g0 g1 0],out) , evalfis([g0 0 g2],out)), evalfis([g0 g1 g2],out)); 
    if g_weight >128 
     largeCount = largeCount+1; 
    end 

    %% Gradient Calculation in Direction : S 
    g0 = double(img_temp(3, 2)- img_temp(2,2)); 
    g1 = double(img_temp(2, 3)- img_temp(2,2)); 
    g2 = double(img_temp(2 ,1)- img_temp(2,2)); 

    g_weight = max (max (evalfis([g0 g1 0],out) , evalfis([g0 0 g2],out)), evalfis([g0 g1 g2],out)); 
    if g_weight >128 
     largeCount = largeCount+1; 
    end 

    %% Gradient Calculation in Direction : SW 
    g0 = double(img_temp(3,1) - img_temp(2,2)); 
    g1 = double(img_temp(3,3) - img_temp(2,2)); 
    g2 = double(img_temp(1,1) - img_temp(2,2)); 


    g_weight = max (max (evalfis([g0 g1 0],out) , evalfis([g0 0 g2],out)), evalfis([g0 g1 g2],out)); 
    if g_weight >128 
     largeCount = largeCount+1; 
    end 

    %% Gradient Calculation in Direction : W 
    g0 = double(img_temp(2,1)- img_temp(2,2)); 
    g1 = double(img_temp(3,2)- img_temp(2,2)); 
    g2 = double(img_temp(1,2)- img_temp(2,2)); 


    g_weight = max (max (evalfis([g0 g1 0],out) , evalfis([g0 0 g2],out)), evalfis([g0 g1 g2],out)); 
    if g_weight >128 
     largeCount = largeCount+1; 
    end 

    %% Gradient Calculation in Direction : NW 
    g0 = double(img_temp(1,1)- img_temp(2,2)); 
    g1 = double(img_temp(3,1)- img_temp(2,2)); 
    g2 = double(img_temp(1,3)- img_temp(2,2)); 


    g_weight = max (max (evalfis([g0 g1 0],out) , evalfis([g0 0 g2],out)), evalfis([g0 g1 g2],out)); 
    if g_weight >128 
     largeCount = largeCount+1; 
    end 
    %% if largeCount > 4 then the pixel is noisy for sure 
     if largeCount> 4 

    %% Add the pixel value to histogram 
     img_out(r,c)=0; 

     else 
     %% Don't change pixel value 

     img_out(r,c) = img_temp(2,2); 
     end 
    end 
    k = k+1; 
end 

figure ; imshow(img_out); 

答えて

0

あなたは、画像内の各中央ピクセルに対して3×3画素の近傍を抽出している。

、ここでは、私の編集されたコードです。ただし、グラデーションを評価するときは、元画像に対して座標系を使用しており、抽出されたピクセル近傍自体は使用していません。

したがって、すべての勾配計算が間違っています。これは、rcが近隣の行と列の最大の次元である3の値を超える可能性があるために明らかです。

最も簡単な解決策は、抽出されたイメージの座標系に対して、元のイメージ座標系ではなく、すべてのインデックス操作を3 x 3ピクセル近傍に修正することです。

3311、最終的にすべてのr+1c+1ですべてrc22と、すべてのr-1c-1を交換してください。アルゴリズムの精度に関しては、これが唯一必要な修正でなければなりません。あなたの記述を正しく理解すれば、これは多かれ少なかれあなたが望むものを与えるはずです。ただし、疑わしい変数にはアクセスされていますが、スクリプトには定義されていません。このような変数は、out,outputおよびtempです。私はこれらを信仰でとり、あなたがこのコードの前にこれらを宣言したと仮定します。あなたが望むことをするためには、より多くのベクトル化されたアプローチがありますが、私はそれを練習として残します。

具体的には、変更:

g0 = double(img_temp(r-1,c) - img_temp(r,c)); 
    g1 = double(img_temp(r, c-1) - img_temp(r,c)); 
    g2 = double(img_temp(r, c+1) - img_temp(r,c)); 

へ:

g0 = double(img_temp(1,2) - img_temp(2,2)); 
    g1 = double(img_temp(2, 1) - img_temp(2,2)); 
    g2 = double(img_temp(2, 3) - img_temp(2,2)); 

変更:

g0 = double(img_temp(r,c+1) - img_temp(r,c)); 
g1 = double(img_temp(r-1,c) - img_temp(r,c)); 
g2 = double(img_temp(r+1 ,c) - img_temp(r,c)); 

へ:

g0 = double(img_temp(2,3) - img_temp(2,2)); 
g1 = double(img_temp(1,2) - img_temp(2,2)); 
g2 = double(img_temp(3 ,2) - img_temp(2,2)); 

...など。あなたのために変更するにはあまりにも多くのものがありますので、私はあなたが影響を受けるコードブロックの残りの部分についてこれを行うことができると仮定しています。

+0

ああ!そんなにありがとう、私はそれをやるつもりです。 – Shin

+0

それを試してみてください! – rayryeng

+0

それは働いています!ありがとう、あなた。 – Shin