对于我必须要做的练习,我必须手动制作一个类似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
将是具有改变的灰度的新矩阵。
如果我手动在此公式中输入值,我会收到正确的值,但是我无法通过公式推送整个矩阵并获得具有更改值的完整新矩阵。有没有办法轻松做到这一点?
答案 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
用于处理符合条件的所有像素。
另一个技巧是使用元素明智的乘法和除法运算符.*
和./
。如果使用*
运算符将两个矩阵/数组相乘,则这是数学矩阵乘法。如果应用.*
运算符,则内部循环正在按元素处理数组元素。