-2

我想改进我的一个简单的 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
4

2 回答 2

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中使用逻辑索引的标准方法(在此处阅读)。该声明

img_output>max

返回大小等于 的大小的 0/1 数组img_output,其中所有img_output大于max1 的元素。然后您可以将此矩阵用作 中的索引img_output

img_output(img_output>max)

这仅选择img_output逻辑索引等于 1 的条目。然后您可以为它们分配您想要的任何值

img_output(img_output>max) = max

或者,作为旁注,对它们进行任何其他操作,例如

img_output(img_output>max) = img_output(img_output>max).^2;
于 2012-10-19T15:18:09.543 回答
2

你可以做的更短:

function img = cutchannels(img, min_val, max_val)
    img = min( max(double(img),min_val), max_val );
end

这就引出了一个问题,即为什么你想在一个函数中实现它(例如,为什么不在你需要的地方使用这个单行代码?)

作为忠告:minmax是内置 Matlab 函数的名称。虽然合法,但将它们用作变量名也是一种不好的做法。例如,什么

M = max(max, 5)

意思是,什么时候max是变量名?您是使用变量作为输入来索引max变量还是max调用函数?max这让您以及 Matlab 的解析器感到困惑。建议:使用其他变量名称,如minimumor maximum,如上面的函数。

于 2012-10-19T19:18:06.033 回答