2017-03-25 6 views
0

破損していないピクセルをチェックせずに破損したピクセルをすべて修復するにはどうすればよいですか?有限要素法を使用した画像の修復における部分微分方程式の方法

ご協力いただければ幸いです。

P.S.私は、その周辺のピクセルで補間することによって破損したピクセルを修正するアルゴリズムを持っていますが、このアルゴリズムはあまりにも時間がかかるので、イメージ全体で使用することはできません。ここ

は(擬似コードで)アルゴリズムである:

Ek[m, n] = Ik[m − 1, n] + Ik[m + 1, n]+ Ik[m, n − 1] + Ik [m, n + 1] − 4I[m, n] 
Ik+1[m, n] = Ik[m, n] + α Ek[m, n] 

エラーがエクであり、αは係数であるとIKはk番目の反復での画像です。

+0

回答しました。私はあなたの質問を完全には理解していません(最小限の作業例はおそらく助けになるでしょうか?)、謝罪私があなたが実際に尋ねたものとは対照的に私が答えたいと思う質問に答えたなら、 – MarcinKonowalczyk

+0

@MarcinKonowalczykこの回答は多くの助けになりました、ありがとうございます!しかし、問題の全範囲を知りたいのであれば、「壊れた」と呼ばれるピクセルはNaN値ではなく、それらの場所の画像よりも暗くなります。 – Bloggs

+0

ありがとうございます。それははるかに理にかなっています。私はあなたのアルゴリズムがどこから来るのかを見ています。 :)まあ、質問された正確な質問に私が答えなかったとしても、とにかく助けてくれるのはうれしいです。 ;) – MarcinKonowalczyk

答えて

2

あなたの質問を理解する限り、2D配列の各ピクセルを反復処理し、「破損」ピクセルが見つかるたびに何らかのアクションを実行する方法を探しています。あなたの定義が「壊れている」のであれば、「壊れた」とは、isnan - 数字ではないと仮定します。あなたのアルゴリズムは意味をなさない(なぜなら、NaNを平均化して補正されたピクセル値にするため、NaNを与えるからです)。

Ak+1[m, n] = 1/4 * (Ak[m − 1, n] + Ak[m + 1, n]+ Ak[m, n − 1] + Ak [m, n + 1]) 

と私は実際にあなたを誤解している場合、あなたがうまくいけば、フォームを働くことができるようになります:私は、そのためのアルゴリズムは、単にそれに最も近い非対角隣人の平均で完全にピクセルを置き換えていることを前提としていますとにかく私の答え。すべての

まず:

% Make a sample 'corrupted' array 
A = rand(100,100); 
A(A>0.9) = NaN; % ~10% corrupted 

さて、問題は2次破損互いにピクセル、同様に、配列のエッジが存在する場合、このアルゴリズムは失敗したという事実によって複雑になります。後でそれについて心配します。

シンプルあなたは、

I = find(nA); % Finds the indices of the above using linear indexing 
[m,n] = find(nA); % Finds the indices using subscript indexing 

で、それぞれのインデックスを取得したい場合は、

nA = isnan(A); % Boolean array the size of A where each corrupted pixel value is equal to 1 

ですべて破損したピクセルを見つけることができaproach

(ただし、動作していない)あなたの場合MATLABの新機能は、 "logical arrays"、 "find"、 "linear indexing"です。 我々はまた、Aの大きさが必要になりますので、ワークスペース

sA = size(A); 

にあなたはその後、しかし、すべてのインデックスを反復処理し、アルゴリズムを適用することを置くことができます。

for j = 1:length(I) 
    i = I(j); %j'th index 
    [m,n] = ind2sub(sA,i); % Change linear indices to subscripts 
    A(m,n) = 1/4 * (A(m−1,n) + A(m+1,n)+ A(m,n−1) + A(m,n+1)); 
end 

より複雑な(そして実際に作業)メソッド

述べたように、エッジの周りに存在する場合には、アルゴリズムは問題があり、二つ以上のNaNの周りがあるとき(あなたは小さなとして考えることができました小さなエッジ)。エッジの問題に対処するために、境界線を囲み、make your image into a torus(ただし、1ピクセルpaddingも機能します)。次に、最近傍法に従ってピクセルを置き換えることを繰り返す。私は3と2の隣人の交換が大きく壊れたイメージで動作するようにする必要がありました。コードを簡単に修正して、それを止めることができます。とにかく、ここでの実施例である:数値をプロット抑制するimagescとラインアウト

A = peaks(100); 
A(rand(size(A))>0.3) = NaN; % 70% corrupted image 
sA = size(A); 

nrep = [1 1 1]; % Initialise as nonzero 
imagesc(A); drawnow; % Show what is happening 
while any(isnan(A(:))) 
    getA = @(m,n) A(mod(m-1,sA(1)-1)+1,mod(n-1,sA(2)-1)+1); % Wrap the image around the edges 
    numA = @(m,n) sum(isnan([getA(m+1,n),getA(m-1,n),getA(m,n+1),getA(m,n-1)])); % Number of neighbouring NaNs 
    for j = 1:numel(A); 
     if isnan(A(j)); 
      [m,n] = ind2sub(sA,j); 
      switch numA(m,n) 
       case 0 
        cA = 1/4 * (getA(m-1,n) + getA(m+1,n) + getA(m,n-1) + getA(m,n+1)); 
        nrep(1) = nrep(1) + 1; 
       case 1 
        cA1 = 1/3 * (getA(m+1,n) + getA(m,n-1) + getA(m,n+1)); 
        cA2 = 1/3 * (getA(m-1,n) + getA(m,n-1) + getA(m,n+1)); 
        cA3 = 1/3 * (getA(m-1,n) + getA(m+1,n) + getA(m,n+1)); 
        cA4 = 1/3 * (getA(m-1,n) + getA(m+1,n) + getA(m,n-1)); 
        cAs = [cA1 cA2 cA3 cA4]; 
        ok = ~isnan(cAs); ok = find(ok,1); % find first cA# which is not a NaN 
        cA = cAs(ok); 
        nrep(2) = nrep(2) + 1; 
       case 2 
         cA1 = 1/2 * (getA(m+1,n) + getA(m,n+1)); 
         cA2 = 1/2 * (getA(m+1,n) + getA(m,n-1)); 
         cA3 = 1/2 * (getA(m-1,n) + getA(m,n+1)); 
         cA4 = 1/2 * (getA(m-1,n) + getA(m,n-1)); 
         cA5 = 1/2 * (getA(m+1,n) + getA(m-1,n)); 
         cA6 = 1/2 * (getA(m,n+1) + getA(m,n-1)); 
         cAs = [cA1 cA2 cA3 cA4 cA5 cA6]; 
         ok = ~isnan(cAs); ok = find(ok,1); % find first cA# which is not a NaN 
         cA = cAs(ok); 
         nrep(3) = nrep(3) + 1; 
       case 3 
        continue 
       case 4 
        continue 
      end 
     A(j) = cA; % Replace element 
     end 
    end 
    imagesc(A); drawnow; pause(0.01); % Show what is happening 
end 

コメント(それが見えるかもしれませとしてクール;))。コードはややramshackledで、多くのことを改善することができるが、あるとして、それはかなりうまく機能:

オリジナル

Original

復興フォーム50%の破損

50% corruption

復興フォーム腐敗70%

70% corruption

ハイブマインド法(私の頼りに法)

ためにGoogle、したがってコードのthis部分に到着するかを知っています。必要に応じて調整します。

+0

この答えはそれ以上です。よくやった。 – duffymo

関連する問題