为了进行练习,我必须手动使MATLAB过滤器像imshow
一样。我制作了以下公式:
if(picture2<w)
picture3 = (picture2-b)*heaviside((picture2-b)/w))*heaviside(1-(picture2/w));
else
picture3 = 1;
end
picture2
是某个像素的值(在这种情况下为360x331的矩阵), b
是应为黑色的最低值,而 w
是我希望发生的区域的宽度。picture3
将是带有更改灰度的新矩阵。
如果我手动将值输入此公式,我会收到正确的值,但是我无法将整个矩阵推向公式,并获得具有更改值的完整新矩阵。有没有办法轻松执行此操作?
分析
matlab/八度为您要做的事情提供矢量化表达。
解决方案
以下代码应执行您的意图。
% 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
矩阵ltw
,其中包含1个或为每个像素符合条件>w
。然后,使用逻辑矩阵ltw
来解决与您的病情匹配的所有像素。
另一个技巧是使用元素明智的乘法和 ./
和 CC_11的划分。如果您使用*
操作员乘以两个矩阵/数组,则是数学矩阵乘法。如果应用.*
操作员,内部环将按元素处理数组元素。