我想改进一个简单的matlab函数。 有没有算术方法来实现这个功能?我认为这会表现得更好。
function img_output = cutchannels(img_input, min, max)
[r c l] = size(img_input);
img_output = double(img_input);
for i = 1:r
for j = 1:c
for k = 1:l
if(img_output(i:j:k)> max)
img_output(i:j:k) = max;
elseif(img_output(i:j:k) < min)
img_output(i:j:k) = min;
end
end
end
end
end
答案 0 :(得分:6)
如果我理解正确,这就是你想要做的事情
function img_output = cutchannels(img_input, min, max)
img_output = double(img_input);
img_output(img_output>max) = max;
img_output(img_output<min) = min;
end
首先,我认为您的索引存在错误:img_output(i:j:k)
实际上应该读取img_output(i,j,k)
- 这是索引3D数组的方法。
以上是在MATLAB(read about it here)中使用逻辑索引的标准方法。声明
img_output>max
返回大小等于img_output
大小的0/1数组,其中img_output
中大于max
的所有元素均为1.您可以将此矩阵用作img_output
img_output(img_output>max)
这只选择逻辑索引等于1的img_output
条目。然后可以为它们分配任何你想要的值
img_output(img_output>max) = max
或作为附注,对它们进行任何其他操作,例如
img_output(img_output>max) = img_output(img_output>max).^2;
答案 1 :(得分:2)
你可以做得更短:
function img = cutchannels(img, min_val, max_val)
img = min( max(double(img),min_val), max_val );
end
这引出了一个问题,为什么你想要在一个函数中实现它(例如,为什么不在你需要的任何地方使用这个单行?)
作为建议:min
和max
是内置Matlab函数的名称。尽管是合法的,但将它们用作变量名称也是不好的做法。例如,
M = max(max, 5)
是什么意思,当max
是变量名时?您是将max
变量编入索引,还是将max
函数编入索引,并将变量max
作为输入?这对你和Matlab的解析器都很困惑。建议:使用其他变量名称,例如minimum
或maximum
,如上面的函数所示。