如何处理边缘情况:循环和模数

时间:2018-06-28 01:38:47

标签: matlab for-loop modulo

我正在尝试对以下图像进行裸露的图像处理:example image我的for循环正是我想要的:它使我能够找到强度最高的像素,并且还记得该像素的坐标。但是,只要遇到rows的倍数(在这种情况下等于18),代码就会中断。

例如,该图像的长度(rows * columns的{​​{1}})为414。因此,在414/18 = 23种情况下程序失败(即,列数)。 也许有一种更好的方法可以实现我的目标,但这是我可以想到的一种按像素强度对图像进行排序同时又知道每个像素坐标的唯一方法。很高兴提出替代代码的建议,但是如果有人对如何处理image的情况(即,向量的索引可被总行数整除)感到非常高兴。

mod(x,18) = 0

1 个答案:

答案 0 :(得分:2)

您知道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看到这一点。对于正输入,remmod是相同的,因此x的计算方法相同。但是对于计算{{1 }}他们避免使用y,我想它会稍微更有效。


请注意

floor

相同
image(x,y)

也就是说,您可以直接使用线性索引来索引二维数组。