график, представляющий рандомизацию каждого столбца в двоичной матрице

#arrays #matlab #image-processing #matrix

#массивы #matlab #обработка изображений #матрица

Вопрос:

Представьте следующее двоичное изображение, иллюстрируемое приведенной ниже матрицей. Это упрощенная версия изображений, с которыми я буду работать:

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

Я хочу построить график, который будет представлять случайность каждого столбца. Моя мысль состоит в том, чтобы разработать случайный индекс = общее количество переходов между каждым значением в столбце / по общему количеству возможных переходов. В приведенной выше матрице каждый столбец может иметь в общей сложности 3 возможных перехода.

Для примера выше:

Столбец 1 будет иметь случайный индекс 0% (0/3)

Столбец 2 будет иметь случайный индекс 66,7% (2/3)

Столбец 3 = 100% (3/3)

Столбец 4 = 0% (0/3), даже если они равны 1, а не 0. Не имеет значения, я просто хочу переходы.

Могу ли я нарисовать границу вокруг всех значений 1, а затем просуммировать MATLAB все границы?

Ответ №1:

Чтобы вычислить то, что вы предлагаете, вы можете просто сделать:

 sum( diff(A) ~= 0 )
  

diff(A) Будет учитываться прямая разница по столбцам, а сумма будет подсчитывать количество ненулевых изменений. Итак, если вы сделаете это, вы получите:

 ans =
     0     2     3     0
  

Комментарии:

1. пропустил процент, но в другом ответе это есть.

2. Это фантастика. Отличные ответы.

Ответ №2:

Пусть ваше изображение определяется как

 im = [ 0 1 0 1
       0 1 1 1
       0 0 0 1
       0 1 1 1 ];
  

Требуемый случайный индекс может быть вычислен как

 result = sum(diff(im)~=0) / (size(im,1)-1);
  

Объяснение: diff вычисляет разницу между последовательными элементами в каждом столбце. Результат сравнивается с нулем ( ~=0 ), и все ненулевые значения в каждой строке суммируются (с sum ). Наконец, результат делится на максимальное количество переходов, которое равно количеству строк минус 1 () size(im,1)-1


Эквивалентно, вы могли бы использовать xor между последовательными строками:

 result = sum(xor(im(1:end-1,:), im(2:end,:))) / (size(im,1)-1)
  

Комментарии:

1. вы, ребята, потрясающие. Спасибо!

2. Вы должны принять ответ @LuisMendo, чтобы он получил кредит. 🙂 Вы тоже можете проголосовать за него (и за меня, если хотите. Он опередил меня в правильном ответе.)

3. @brechmos Пользователи с низкой репутацией не могут проголосовать. Но вы заслуживаете одобрения, так что вот оно 🙂