Пожалуйста, помогите мне проверить мою гипотезу с соседними элементами в матрице - PullRequest
1 голос
/ 17 августа 2010

Я не мог понять последнюю часть своего исследования, поэтому, если бы кто-нибудь мог мне помочь, я был бы очень признателен за помощь ..:)

Скажите, что моя оригинальная матрица,

X =

     0     0     0     0     0
     0     0    12     9     0
     0     4     9    15     0
     0    11    19     0     0
     0     2     4     8     0
     0     4     5     8     0
     0     0     0     0     0

и после нахождения среднего числа ненулевых я получу что-то вроде ниже:

new_x =

     0         0           0           0         0 
     0         0       **9.0000**    9.0000      0 
     0      4.0000       9.0000    **9.0000**    0 
     0    **8.3333**   **8.0000**      0         0 
     0      2.0000       4.0000      8.0000      0 
     0      4.0000       5.0000      8.0000      0 
     0        0            0           0         0 

Обратите внимание, что любые элементы, которые больше 10, являются "центром", и мы хотим найтисреднее число ненулевых с радиусом, скажем, 1 м.где 1 метр = 1 элемент от центра.

** ** означает центр.

Для этой части я использовал следующее (из gnovice ):

X=[0 0 0 0 0; 0 0 12  9 0; 0 4 9 15 0; 0 11 19 0 0;
   0 2 4 8 0; 0 4 5 8 0; 0 0 0 0 0];
kernel=[0 1 0; 1 0 1; 0 1 0];
sumx=conv2(X,kernel,'same');
nx=conv2(double(X>0),kernel,'same');
index=(X>10);
new_x=X;
new_x(index)=sumx(index)./max(nx(index),1);

Итак мой вопрос заключается в том, что я хочу сравнить соседние элементы с их центром , равны они, меньше или больше.Если оно больше или равно «1» или «0». Также любые элементы, находящиеся за пределами радиуса, можно игнорировать и заменить на «0».

Например, 9 в серединенаходится в радиусе 12, 15 и 19 центров, поэтому возьмите минимальный центр из этих `min [9.000, 9.000, 8.000] = 8.000.В этом случае 4 не будет приниматься во внимание, так как он не называется «центром», а также [8 4 5 и 8] в последних двух строках.

Поэтому я хочу что-то вроде ниже:

Test_x =

         0         0           0           0         0
         0         0           1           1         0
         0         0           1           1         0
         0         1           1           0         0
         0         0           0           0         0
         0         0           0           0         0
         0         0           0           0         0

Я разместил эту первую часть на форуме раньше, и я очень благодарен за каждое предложение ранее.

Пожалуйста, дайте мне несколько идей для начала.Я пытался использовать цикл, но, похоже, он не работал очень хорошо.Любая функция MATLAB, которая может выполнить эту работу за меня ..

Большое спасибо за помощь.

Новичок в MATLAB


Я думаю, что нашел решениена этот вопрос с помощью методов Джонаса.Спасибо за помощь Джонасу и Новичку:)

X = [0 0 0 0 0;0 0 12 9 0;0 4 9 15 0;0 11 19 0 0;0 2 4 8 0;0 4 5 8 0;0 0 0 0 0];

kernel = [0 1 0;1 0 1;0 1 0];

sumx = conv2 (X, ядро, "то же самое");

nx = conv2 (double (X> 0), ядро, "то же самое");

avg_x = X;

avg_x (avg_x <10) = 0; </p>

index = (avg_x> 10);

avg_x (index) = sumx (index) ./ max (nx (index), 1);

avg_x =

     0         0         0         0         0
     0         0    9.0000         0         0
     0         0         0    9.0000         0
     0    8.3333    8.0000         0         0
     0         0         0         0         0
     0         0         0         0         0
     0         0         0         0         0

tmp_x = avg_x;

maxVal = max (avg_x (:)) + 1;

tmp_x (tmp_x == 0) = maxVal;

tmp_x = imerode (tmp_x, kernel);

Test_x = X> = tmp_x;

1 Ответ

1 голос
/ 17 августа 2010

Я думаю, что вы хотите сделать, это создать новый массив на основе new_x, который заменяет каждый элемент минимумом его 4-соединенных соседей.Затем вы можете сравнить новый массив с new_x.

Вот способ сделать это (требуется набор инструментов для обработки изображений)

tmp_x = new_x;
maxVal = max(new_x(:))+1;
tmp_x(tmp_x == 0) = maxVal; %# replace all the zeros in tmp_x with something large
tmp_x = imerode(tmp_x,kernel); %# kernel is the same as in the OP
Test_x = new_x >= tmp_x; %# put ones wherever the value is
                         %# greater or equal the neighbour's minimum 
%# only keep 1's that are next to 'centers'
Test_x = Test_x .* imdilate(X>10,strel('disk',1))

Test_x =
     0     0     0     0     0
     0     0     1     1     0
     0     0     1     1     0
     0     1     1     0     0
     0     0     1     0     0
     0     0     0     0     0
     0     0     0     0     0

Обратите внимание, что я получил еще один с этой логикой, чем выделаем.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...