Matlab: выберите часть матрицы

Следующий скрипт дает мне ошибку "Индексы нижнего индекса должны быть либо натуральными положительными целыми числами, либо логическими".

Я не понимаю, почему, поскольку переменные являются целыми числами. Более того, я также приведу их к целым числам.

Код является:

x_start = int16(x-matrixRay);
        x_end = uint16(x+matrixRay);
        y_start = uint16(y-matrixRay);
        y_end = uint16(y+matrixRay);
        matrix = img(x_start:x_end,y_start:y_end);

Я поставил точку останова перед кодом выше. Ниже я перечисляю значения переменных:

    K>> x_start

x_start =

  uint16

   298

K>> x_end

x_end =

  uint16

   302

K>> y_start

y_start =

  uint16

   88

K>> y_end

y_end =

  uint16

   92

K>> matrixRay

matrixRay =

     2

Я не могу опубликовать всю матрицу "img", так как она довольно большая. Рабочая область это 1369x1173 uint8.

1 ответ

Решение

Как уже отмечали другие, int8 (от -128 до 127) явно не покроет размер вашего изображения. Учитывая размер, вы можете использовать uint16 для индекса. Не имеет смысла использовать целое число со знаком для индексации. Вы можете просто использовать round для создания индекса, если он не целочисленный.

Но int8 просто дает вам неправильный результат (на мой взгляд, хуже, чем ошибка). Ошибка, которую вы получили, потому что ваш x_start или y_start равен нулю. Вы можете легко проверить это, установив точку останова.

Если вы уверены, что хотите делать то, что хотите, вы можете решить проблему следующим образом:

x_start = round(x-matrixRay); % or uint16 if size is less than 2^16
x_start = max(x_start, 1); % use 1 if less than 1
x_end = round(x+matrixRay);
x_end = min(x_end, size(img,1)); % clip to max of img size

Аналогичное должно применяться к y_start и y_end.

Другие вопросы по тегам