应用滑动窗口操作后如何设置边框像素的值?



在对 MATLAB 中的图像应用stdfilt(i, ones(5, 5))等滑动窗口操作后,我想将边框像素(使用填充计算的像素)设置为NaN以将它们标记为无意义。在此示例中,我将最外层的两行和列设置为NaN。给定一个 M * M 窗口,如何将此宽度为 (M - 1)/2 像素的边框设置为特定值?

假设矩阵r(stdfilt的结果)。下面是如何将 NaN 分配给边框的示例。 通常,您需要指定正确的索引。

>> r = rand(4)
r =
0.8147    0.6324    0.9575    0.9572
0.9058    0.0975    0.9649    0.4854
0.1270    0.2785    0.1576    0.8003
0.9134    0.5469    0.9706    0.1419
>> r([1, end], :) = nan
r =
NaN       NaN       NaN       NaN
0.9058    0.0975    0.9649    0.4854
0.1270    0.2785    0.1576    0.8003
NaN       NaN       NaN       NaN
>> r(:, [1, end]) = nan
r =
NaN       NaN       NaN       NaN
NaN    0.0975    0.9649       NaN
NaN    0.2785    0.1576       NaN
NaN       NaN       NaN       NaN

更新:一般来说,由于图像是一个矩阵,你的问题是"如何设置某些矩阵值?答案是:"使用矩阵的索引"。有很多方法可以做到这一点(例如,通过构建索引矩阵、逻辑掩码或使用行/列坐标)。决定使用哪种方法通常取决于此特定任务的操作速度。例如,如果需要用 NaN 替换零,则使用逻辑掩码会更快:r(r == 0) = nan,依此类推。

首先找到NaN在矩阵中的位置。假设映像名称为 A。

a = isnan(A);

这将创建矩阵a,在数字位置为 0,在NaN的位置为 1。然后查找Nan元素的位置,如下所示:

[x,y]=find(a==1);

然后将它们替换为值V为:

for i=1:length(x)
A(x(i),y(i)) = V;
end

这将完成这项工作,但这似乎是图像处理工具箱中的那种功能。

mask = logical(ones(size(i)));
width = (m - 1) / 2;
mask(width + 1:size(i, 1) - width, width + 1:size(i, 2) - width) = 0;
i(mask) = NaN;