Как иметь дело с краевыми чехлами: для петель и по модулю - PullRequest
0 голосов
/ 28 июня 2018

Я пытаюсь применить к изображениям обычную обработку изображений: example image Мой цикл for выполняет именно то, что я хочу: он позволяет мне находить пиксели с наибольшей интенсивностью, а также запоминать координаты. этого пикселя. Однако код ломается всякий раз, когда встречается кратное rows & ndash; что в данном случае равно 18.

Например, длина этого изображения (rows * columns из image) составляет 414. Таким образом, существует 414/18 = 23 случая, когда программа завершается с ошибкой (то есть количество столбцов). Возможно, есть лучший способ достичь моей цели, но это единственный способ, которым я мог бы подумать о сортировке изображения по интенсивности пикселей, а также зная координаты каждого пикселя. Рад принять предложения альтернативного кода, но было бы замечательно, если бы кто-то имел представление о том, как обрабатывать случаи, когда mod(x,18) = 0 (т. Е. Когда индекс вектора делится на общее количество строк).

image = imread('test.tif');      % feed program an image
image_vector = image(:);         % vectorize image

[sortMax,sortIndex] = sort(image_vector, 'descend');   % sort vector so 
                              %that highest intensity pixels are at top
max_sort = [];
[rows,cols] = size(image);

for i=1:length(image_vector)
   x = mod(sortIndex(i,1),rows);         % retrieve original coordinates 
                                         % of pixels from matrix "image"
   y = floor(sortIndex(i,1)/rows) +1;
   if image(x,y) > 0.5 * max            % filter out background noise
      max_sort(i,:) = [x,y];
   else
      continue
   end
end

1 Ответ

0 голосов
/ 28 июня 2018

Вы знаете, что индексирование MATLAB начинается с 1, потому что вы делаете +1, когда вычисляете y. Но вы забыли сначала вычесть 1 из индекса. Вот правильное вычисление:

index = sortIndex(i,1) - 1;
x = mod(index,rows) + 1;
y = floor(index/rows) + 1;

Это вычисление выполняется функцией ind2sub, которую я рекомендую вам использовать.

Редактировать : На самом деле, ind2sub соответствует:

x = rem(sortIndex(i,1) - 1, rows) + 1;
y = (sortIndex(i,1) - x) / rows + 1;

(вы можете увидеть это, набрав edit ind2sub. rem и mod одинаковы для положительных входов, поэтому x вычисляется одинаково. Но для вычислений y они избегают floor, I думаю, это немного более эффективно.


Обратите внимание, что

image(x,y)

совпадает с

image(sortIndex(i,1))

То есть вы можете использовать линейный индекс непосредственно для индексации в двумерном массиве.

...