通过函数

时间:2017-11-21 12:29:49

标签: matlab

对于我必须要做的练习,我必须手动制作一个类似imshow的MATLAB过滤器。我做了以下公式:

if(picture2<w)
    picture3 = (picture2-b)*heaviside((picture2-b)/w))*heaviside(1-(picture2/w));
else
    picture3 = 1;
end

其中picture2是某个像素的值(在这种情况下为360x331的矩阵),b是应该为黑色的最低值,w是该值的宽度我希望灰度发生的区域。 picture3将是具有改变的灰度的新矩阵。

如果我手动在此公式中输入值,我会收到正确的值,但是我无法通过公式推送整个矩阵并获得具有更改值的完整新矩阵。有没有办法轻松做到这一点?

1 个答案:

答案 0 :(得分:1)

分析

Matlab / Octave为您想要的内容提供矢量化表达式。

解决方案

以下代码应该按照您的意图执行。

% Create an image with all 1 and same size as input
picture3 = ones(size(picture2));

% find pixels that are below w
ltw =  picture2<w;

% Process all pixels <w
picture3(ltw) = (picture2(ltw)-b) .* heaviside((picture2(ltw)-b) ./ w)) .* heaviside(1-(picture2(ltw) ./ w));

解释

一个技巧是为满足条件logical的每个像素创建一个包含1或true的ltw矩阵>w。然后,逻辑矩阵ltw用于处理符合条件的所有像​​素。

另一个技巧是使用元素明智的乘法和除法运算符.*./。如果使用*运算符将两个矩阵/数组相乘,则这是数学矩阵乘法。如果应用.*运算符,则内部循环正在按元素处理数组元素。