У меня есть матрица m-by-n с именем A со значениями 1 и 0. Я хочу преобразовать все значения 0s в 1s, если по крайней мере 5 из 8 соседних пикселей равны 1 с. Я попытался использовать функцию nlfilter
, но я не понимаю, как использовать arg fun
, и мне нужна помощь. Я создал функцию, как ручки для nlfilter
следующим образом:Анализ соседства в MATLAB
function b = gap_fill(A)
b=A;
index= A([1 2 3 4 6 7 8 9]);
if sum(index)>=5
b(5)= 1
end
end
Затем я попытался сделать это:
B= nlfilter(A,[3 3],@gap_fill)
Но он дал эту ошибку:
??? Subscripted assignment dimension mismatch.
Error in ==> nlfilter at 75
b(i,j) = feval(fun,x,params{:});
Любое предложение? Основная проблема заключается в том, что я не использую функции.
= ОБНОВЛЕНИЕ =
я, наконец, пришел с хорошим результатом. Я изменил свою функцию для вывода скаляра, и когда я использую его как fun
arg в nlfilter
, он работает так, как я хочу. Это мой код, спасибо за помощь, и я надеюсь, что это может быть полезным для кого:
function b = gap_fill(A)
index= A([1 2 3 4 6 7 8 9]);
if sum(index)>=5
A(5)= 1;
end
b=A(5);
end
В MATLAB:
b= nlfilter (A,[3 3],'gap_fill')
мне нужно, чтобы избежать превращения 1s в 0s, как в B вашего примера – umbe1987
@ umbe1987 Применить окончательную «или» операцию: «B = B | A;» (см. обновленный ответ) –