#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 Пользователи с низкой репутацией не могут проголосовать. Но вы заслуживаете одобрения, так что вот оно 🙂