あなたの質問を理解する限り、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](https://i.stack.imgur.com/IxXmK.png)
復興フォーム50%の破損
![50% corruption](https://i.stack.imgur.com/eCxvA.png)
復興フォーム腐敗70%
![70% corruption](https://i.stack.imgur.com/xSHin.png)
ハイブマインド法(私の頼りに法)
ためにGoogle、したがってコードのthis部分に到着するかを知っています。必要に応じて調整します。
回答しました。私はあなたの質問を完全には理解していません(最小限の作業例はおそらく助けになるでしょうか?)、謝罪私があなたが実際に尋ねたものとは対照的に私が答えたいと思う質問に答えたなら、 – MarcinKonowalczyk
@MarcinKonowalczykこの回答は多くの助けになりました、ありがとうございます!しかし、問題の全範囲を知りたいのであれば、「壊れた」と呼ばれるピクセルはNaN値ではなく、それらの場所の画像よりも暗くなります。 – Bloggs
ありがとうございます。それははるかに理にかなっています。私はあなたのアルゴリズムがどこから来るのかを見ています。 :)まあ、質問された正確な質問に私が答えなかったとしても、とにかく助けてくれるのはうれしいです。 ;) – MarcinKonowalczyk